在JS中,存在多种为数组排序的方法,比如数组内置方法sort和reverse。除此之外,我们也可以使用一些经典算法来给数组排序,比如:冒泡排序,选择排序等等
一、内置排序方法
sort: array.sort([compareFunction])
compareFunction: 比较函数,即用来定义排序顺序的函数。如果省略,元素将按照字符串 的 Unicode 码点顺序进行排序。
返回值:排序后的数组。注意, sort 方法会就地修改原数组,而不是开辟新的空间返回新数组。
示例代码:
// 数字排序(升序)
let numbers = [40, 100, 1, 5, 25, 10];
numbers.sort((a, b) => a - b); //降序是b-a [1, 5, 10, 25, 40, 100]
// 对象数组排序(按年龄升序)
let people = [
{ name: 'Alice', age: 30 },
{ name: 'Bob', age: 20 },
{ name: 'Charlie', age: 40 }
];
people.sort((a, b) => a.age - b.age); //降序相反
console.log(JSON.stringify(people)); // [{ name: 'Bob', age: 20 }, { name: 'Alice', age: 30 }, { name: 'Charlie', age: 40 }]
//二维数组排序(按照第二列升序)
let mixtr = [
[2 ,5, 6],
[5, 3, 4],
[3, 9, 10],
[5, 11, 7]
]
mixtr.sort((a, b) => a[1] - b[1]); // [[5, 3, 4], [2, 5, 6], [3, 9, 10], [5, 11, 7]]
注意事项:
compareFunction应该是一个函数,它接收两个参数,并返回一个数字。如果返回值小于 0, 则第一个参数会排在第二个参数之前;如果返回值大于 0,则第一个参数会排在第二个参数之 后;如果返回值等于 0,则两个参数的位置不变。
如果不提供 compareFunction,sort 方法会将数组元素转换为字符串,并按照字符串的 Unicode 码点顺序进行排序。这可能导致数字排序时出现意外结果。
reverse:反转数组中的元素顺序,语法为 arr.reverse()
返回值:反转后的数组。注意,reverse 方法会就地修改原数组。
示例代码:
let letters = ['a', 'b', 'c', 'd', 'e'];
letters.reverse();
console.log(letters); // ['e', 'd', 'c', 'b', 'a']
二、常见排序算法
冒泡排序
原理:重复地遍历数组,比较相邻的元素。如果前一个元素比后一个元素大,则交换它们。这样,每一轮遍历后,最大的元素会“浮”到数组的最后。重复这个过程,直到没有需要交换的元素。
时间复杂度:,其中 n 是数组的长度。
示例代码:
//以升序为例
function bubbleSort(arr){
let n = arr.length;
for(let i = 0; i < n - 1; i++){
for(let j = 0; j < n - 1 - i; j++){
if(arr[j] > arr[j + 1]){ //降序相反
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
let array = [25, 16, 98, 50, 66, 10, 9, 89, 102, 28, 105, 11, 35, -10];
console.log(JSON.stringify(bubbleSort(array))); // [-10, 9, 10, 11, 16, 25, 28, 35, 50, 66, 89, 98, 102, 105]
选择排序
原理:在未排序序列中找到最小(或最大)元素,存放到排序序列的起始位置。然后,再从剩余未排序元素中继续寻找最小(或最大)元素,放到已排序序列的末尾。重复这个过程,直到所有元素均排序完毕。
时间复杂度:,其中 n 是数组的长度。
//以升序为例
function selectionSort(arr){
let n = arr.length;
for(let i = 0; i < n - 1; i++){
let minIndex = i;
for(let j = i + 1; j < n; j++){
if(arr[j] < arr[minIndex]){
minIndex = j;
}
}
[arr[i], arr[minIndex]] = [arr[minIndex], arr[i]];
}
return arr;
}
小结:排序算法多种多样,这里up着重介绍两种容易理解且比较重要的排序算法。此外,还有插入排序,希尔排序等等著名的排序算法。
下一节:JS数组对象中强大的map方法和reduce方法
2069

被折叠的 条评论
为什么被折叠?



