javascript如何实现排序算法_如何应用于数组排序【教程】

10次阅读

javaScript数组sort()默认按字符串Unicode码点排序,数字数组需传入比较函数;对象数组排序要处理undefined;V8引擎使用TimSort,性能优于手写排序。

javascript如何实现排序算法_如何应用于数组排序【教程】

javascript 数组原生的 sort() 方法默认按字符串 Unicode 码点排序,直接对数字数组调用会得到错误结果(比如 [10, 2, 33] 排成 [10, 2, 33]),必须传入比较函数才能正确排序。

为什么 sort() 默认不按数值排序

因为 sort() 内部会先把每个元素转成字符串再比较。数字 10 转成 "10"2 转成 "2",而 "10" 为 true(字符串比较只看首字符),所以 10 会排在 2 前面。

常见错误现象:

  • [10, 2, 33].sort()[10, 2, 33](不是 [2, 10, 33]
  • [1, 10, -5, 0].sort()[-5, 0, 1, 10](碰巧对了,但只是巧合,不可依赖)

升序/降序:写对比较函数的关键逻辑

比较函数接收两个参数 ab,返回值决定顺序:

立即学习Java免费学习笔记(深入)”;

  • 返回 a 排在 b 前面
  • 返回 0:位置不变(稳定排序中保持原有相对顺序)
  • 返回 > 0a 排在 b 后面

升序最简写法:(a, b) => a - b;降序:(a, b) => b - a

注意:不能直接写 a 或 return a ——这会把 0 当作 false 错误处理,且忽略相等情况。

处理对象数组:按字段排序要小心 undefined

[{name: "Alice", age: 30}, {name: "Bob"}]age 排序时,Bob.ageundefined,参与减法会得 NaN,导致整个排序结果不可预测(甚至返回原数组乱序)。

安全写法示例(升序,undefined 排最后):

arr.sort((a, b) => {   const aVal = a.age ?? Infinity;   const bVal = b.age ?? Infinity;   return aVal - bVal; });

更通用的策略是先做存在性判断或统一兜底值,而不是依赖隐式转换

性能与稳定性:原生 sort() 已足够,别手写快排

V8 引擎(chrome / node.js)的 Array.prototype.sort() 在数组长度 ≥ 10 时使用 TimSort(稳定、高效、适应性强),小数组用插入排序。它比绝大多数手写快排/归并更可靠,也支持稳定排序(ES2019+ 规范保证)。

除非有特殊需求(如自定义比较开销极大、需中断排序、或处理超大数据流),否则不要自己实现排序算法。手写容易出错,还失去引擎优化红利。

真正容易被忽略的是:比较函数里避免副作用(如修改原数组、发起请求)、避免计算密集操作(如反复解析 jsON),这些会让排序变慢甚至行为异常。

text=ZqhQzanResources