文章目录
一、sort() 的工作原理
js的sort方法是用快速排序(quicksort)算法实现的。快速排序算法是一种高效的排序算法,其内部工作原理如下:
首先,选择一个基准元素(pivot),可以选择数组的第一个元素、最后一个元素或者数组中的随机元素。
将数组分成两个子数组,小于基准元素的放在左边,大于基准元素的放在右边,相同的元素可以放在任意一边。
对左右两个子数组分别递归地进行快速排序。
最后,将左子数组、基准元素和右子数组合并起来,得到排序后的数组。
快速排序的关键在于选择合适的基准元素和快速地将数组分成两个子数组。这样每次递归时,子数组的规模都会缩小,使得排序效率很高。
需要注意的是,快速排序是一种不稳定的排序算法,即相同元素的相对顺序可能会发生改变。另外,快速排序的平均时间复杂度为O(nlogn),最坏情况下的时间复杂度为O(n^2)。但是,由于快速排序的递归操作比较简单,所以实际应用中的性能通常比其它排序算法好。
二、sort() 默认排序逻辑与自定义排序
sort()
方法,可以对数组进行排序。该方法默认按照字符串的Unicode编码进行排序,也可以用自定义函数指定排序规则。
基本语法如下:
array.sort([compareFunction])
参数说明:
compareFunction
(可选):用于指定排序规则的函数。如果省略,则按照Unicode编码进行排序。
排序示例:
var fruits = ['apple', 'banana', 'cherry', 'date']; fruits.sort(); console.log(fruits); // ['apple', 'banana', 'cherry', 'date']
如果要按照其他规则排序,可以使用自定义函数。自定义函数接收两个参数,分别是要比较的两个元素。根据两个元素的比较结果,返回负数、零或正数,表示两个元素的相对顺序。
自定义排序示例:
var numbers = [10, 5, 8, 2, 4]; numbers.sort(function(a, b) { return a - b; }); console.log(numbers); // [2, 4, 5, 8, 10]
此例中的自定义排序函数采用a - b
的方式对数组进行升序排序,可以使用b - a
进行降序排序。
需要注意的是,sort()
方法会直接修改原数组,并且默认按照Unicode编码排序,而不是按照数值大小排序。因此,如果要按照数值大小排序,需要使用自定义排序函数。
三、工作中常用案例
在工作中,经常会遇到需要对数组或对象进行排序的情况,以下是一些常用的案例:
- 对数组进行排序:在处理数据时,经常需要将数组按照一定的规则进行排序。例如,对一组数字进行升序或降序排序,可以使用
array.sort()
方法。
var numbers = [5, 1, 3, 2, 4]; numbers.sort((a, b) => a - b); // 升序排序 console.log(numbers); // 输出 [1, 2, 3, 4, 5] numbers.sort((a, b) => b - a); // 降序排序 console.log(numbers); // 输出 [5, 4, 3, 2, 1]
- 对对象数组进行排序:当处理包含对象的数组时,可以使用
array.sort()
方法结合自定义的排序函数对对象进行排序。排序函数需要返回一个负数、零或正数,以指示两个元素的相对顺序。
var students = [ { name: 'Alice', age: 18 }, { name: 'Bob', age: 20 }, { name: 'Charlie', age: 16 } ]; students.sort((a, b) => a.age - b.age); // 按照年龄升序排序 console.log(students); // 输出: // [ // { name: 'Charlie', age: 16 }, // { name: 'Alice', age: 18 }, // { name: 'Bob', age: 20 } // ] students.sort((a, b) => b.age - a.age); // 按照年龄降序排序 console.log(students); // 输出: // [ // { name: 'Bob', age: 20 }, // { name: 'Alice', age: 18 }, // { name: 'Charlie', age: 16 } // ]
- 根据属性对数组对象进行排序:有时需要根据对象的某个属性进行排序。可以使用
array.sort()
方法结合自定义的排序函数来实现。
var products = [ { name: 'Apple', price: 2 }, { name: 'Banana', price: 1 }, { name: 'Orange', price: 3 } ]; products.sort((a, b) => a.price - b.price); // 按照价格升序排序 console.log(products); // 输出: // [ // { name: 'Banana', price: 1 }, // { name: 'Apple', price: 2 }, // { name: 'Orange', price: 3 } // ] products.sort((a, b) => b.price - a.price); // 按照价格降序排序 console.log(products); // 输出: // [ // { name: 'Orange', price: 3 }, // { name: 'Apple', price: 2 }, // { name: 'Banana', price: 1 } // ]
这些案例展示了在工作中常见的排序需求,使用array.sort()
方法结合自定义的排序函数,可以灵活地实现各种排序操作。
总结
以上就是今天的内容了,简单探讨了js中sort的工作原理。同时也简单举例,希望对读者们有所帮助