如何对整数数组进行排序

如何对整数数组进行排序

技术背景

在 JavaScript 中,数组的 sort() 方法是一个非常实用的工具,用于对数组元素进行排序。但需要注意的是,sort() 方法默认按照元素的 Unicode 码点值进行排序,也就是将元素转换为字符串后按字典序排序,这对于整数数组来说往往无法得到预期的结果。因此,在对整数数组进行排序时,需要自定义排序规则。

实现步骤

1. 默认排序问题

默认情况下,sort() 方法对整数数组的排序是按字符串比较的。示例如下:

1
2
3
const myArray = [104, 140000, 99];
myArray.sort();
console.log(myArray); // 输出 [104, 140000, 99]

这是因为 sort() 会将数组元素转换为字符串,比较其 Unicode 码点值。对于 10414000099,先比较第一个字符的 Unicode 码点,1 的码点小于 9,所以 104140000 排在 99 前面。当 104140000 的第一个字符相同时,继续比较下一个字符。

2. 升序排序

要实现整数数组的升序排序,需要为 sort() 方法提供一个比较函数。比较函数接受两个参数 ab,根据返回值决定元素的顺序:

  • 如果返回值小于 0,则 a 排在 b 前面。
  • 如果返回值等于 0,则 ab 的相对位置不变。
  • 如果返回值大于 0,则 b 排在 a 前面。

示例代码如下:

1
2
3
4
5
const myArray = [104, 140000, 99];
myArray.sort(function(a, b) {
return a - b;
});
console.log(myArray); // 输出 [99, 104, 140000]

使用箭头函数可以更简洁地实现:

1
2
3
const myArray = [104, 140000, 99];
myArray.sort((a, b) => a - b);
console.log(myArray); // 输出 [99, 104, 140000]

3. 降序排序

要实现降序排序,只需将比较函数的返回值取反,即将 a - b 改为 b - a。示例如下:

1
2
3
const myArray = [104, 140000, 99];
myArray.sort((a, b) => b - a);
console.log(myArray); // 输出 [140000, 104, 99]

4. 处理特殊值

如果数组中包含 InfinityNaNundefined 等特殊值,可以使用以下方法处理:

1
2
3
const numArray = [3, 5, -1, 1, NaN, 6, undefined, 2, null];
numArray.sort((a, b) => (+a || 0) - (+b || 0) || 0);
console.log(numArray); // 输出 [-1, null, 1, 2, 3, 5, 6, NaN, undefined]

5. 其他排序算法

除了使用 sort() 方法,还可以使用一些经典的排序算法,如插入排序、选择排序等。

插入排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function insertionSort(arr) {
for (let i = 0; i < arr.length; i++) {
let target = arr[i];
let j = i - 1;
while (j >= 0 && arr[j] > target) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = target;
}
return arr;
}

const numArray = [140000, 104, 99];
const sortedArray = insertionSort(numArray);
console.log(sortedArray); // 输出 [99, 104, 140000]

选择排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function selectionSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
let min = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[j] < arr[min]) {
min = j;
}
}
if (min !== i) {
let temp = arr[i];
arr[i] = arr[min];
arr[min] = temp;
}
}
return arr;
}

const numArray = [140000, 104, 99];
const sortedArray = selectionSort(numArray);
console.log(sortedArray); // 输出 [99, 104, 140000]

核心代码

以下是几种常见的整数数组排序代码示例:

升序排序

1
2
3
const numArray = [140000, 104, 99];
numArray.sort((a, b) => a - b);
console.log(numArray);

降序排序

1
2
3
const numArray = [140000, 104, 99];
numArray.sort((a, b) => b - a);
console.log(numArray);

处理特殊值排序

1
2
3
const numArray = [3, 5, -1, 1, NaN, 6, undefined, 2, null];
numArray.sort((a, b) => (+a || 0) - (+b || 0) || 0);
console.log(numArray);

最佳实践

  • 使用箭头函数:箭头函数可以使代码更简洁,尤其是在简单的比较函数中。
  • 考虑性能:对于大规模数组,经典排序算法(如插入排序、选择排序)的性能可能不如 sort() 方法。因此,在实际应用中,优先使用 sort() 方法。
  • 处理特殊值:在排序前,确保对数组中的特殊值进行处理,避免排序结果不符合预期。

常见问题

1. sort() 方法修改原数组

sort() 方法会直接修改原数组,而不是返回一个新的排序后的数组。如果需要保留原数组,可以先复制一份再进行排序。示例如下:

1
2
3
4
const originalArray = [104, 140000, 99];
const sortedArray = [...originalArray].sort((a, b) => a - b);
console.log(originalArray); // 原数组不变
console.log(sortedArray); // 排序后的数组

2. 比较函数的性能

在比较函数中,尽量避免使用复杂的计算或函数调用,以免影响排序性能。

3. 兼容性问题

虽然大多数现代浏览器都支持 sort() 方法和箭头函数,但在一些旧版本的浏览器中可能存在兼容性问题。在使用时,建议进行兼容性测试。


如何对整数数组进行排序
https://119291.xyz/posts/how-to-sort-an-array-of-integers/
作者
ww
发布于
2025年7月16日
许可协议