javascript如何实现排序_有哪些排序算法【教程】

技术百科 狼影 发布时间:2026-01-28 浏览:
Array.prototype.sort() 默认按字符串字典序排序,导致数值排序错误;需传入比较函数如(a,b)=>a-b实现数字排序;它原地修改数组,稳定性和可控性不足时需手写排序。

JavaScript 里实现排序,Array.prototype.sort() 是最常用、最直接的方式,但它的默认行为不是按数值大小排——这是绝大多数人踩坑的第一步。

为什么 sort() 默认排序结果看起来“错”了

因为 sort() 默认把元素转成字符串再比较字典序。比如 [10, 2, 33, 1] 会变成 ["10","2","33","1"],然后按首字符排序 → [1, 10, 2, 33](实际输出是 [1, 10, 2, 33])。

  • 要按数字升序:传入 (a, b) => a - b
  • 要按数字降序:传入 (a, b) => b - a
  • 对对象数组排序,比如按 age 字段: arr.sort((a, b) => a.age - b.age)
  • 注意:sort() 是原地修改,会改变原数组

哪些场景不能用 sort()?手写排序的必要性

当需要稳定排序(相同值的相对位置不变)、或明确控制比较逻辑(比如多级排序、自定义权重)、或在性能敏感场景下规避 V8 对 sort() 的内部优化不确定性时,就得自己实现。

  • Array.prototype.sort() 在 V8 中对小数组(
  • 如果排序依据是异步计算的(比如按接口返回的优先级),sort() 无法直接支持,必须先 await 拿到全部值再排
  • 需要记录每轮交换过程(教学、可视化)时,必须手写

快速写出一个可靠的插入排序(适合小数组 / 教学)

插入排序逻辑清晰、稳定、原地、适合小规模数据(≤50 项),且容易调试和改造成带日志的版本。

function insertionSort(arr) {
  const result = [...arr]; // 不污染原数组
  for (let i = 1

; i < result.length; i++) { let j = i; while (j > 0 && result[j] < result[j - 1]) { [result[j], result[j - 1]] = [result[j - 1], result[j]]; j--; } } return result; }
  • 对比 sort():它不依赖类型转换,=== 行为完全由你控制
  • 如果要支持对象,把 result[j] 换成 compare(result[j], result[j - 1]) ,再传入自定义 compare 函数即可
  • 别在生产环境对 1000+ 元素用这个——时间复杂度 O(n²),卡顿明显

冒泡、快排、归并……真有必要手写吗

除非你在写算法题、教学材料,或者嵌入式 JS 环境(如某些 IoT 设备)连 sort() 都不支持,否则不建议在业务代码中手写这些。

  • 冒泡排序仅剩教学价值;现代 JS 引擎对 sort() 的优化远超手写
  • 快排手写易出错(边界、pivot 选择、递归爆栈),V8 的实现还做了三数取中、尾递归优化等
  • 归并排序适合稳定 + 大数据量,但需要 O(n) 额外空间;若真需要,用 arr.toSorted?.((a,b)=>a-b)(ES2025 新增,返回新数组且稳定)更省心

真正容易被忽略的是:排序前先确认数据是否已部分有序,以及是否真的需要「每次调用都重排」——很多时候缓存排序结果或用增量更新(如 splice 插入后局部调整)更高效。


# 的是  # 这是  # 你在  # 都不  # 自定义  # 就得  # 排序算法  # 递归  # 对象  # javascript  # java  # 字符串  # 为什么  # 算法  # 不能用  # sort  # Array  # 升序  # 真有  # prototype 


相关栏目: <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 AI推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 SEO优化<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 技术百科<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 谷歌推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 百度推广<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 网络营销<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 案例网站<?muma echo $count; ?> 】 <?muma $count = M('archives')->where(['typeid'=>$field['id']])->count(); ?> 【 精选文章<?muma echo $count; ?>

相关推荐

在线咨询

点击这里给我发消息QQ客服

在线咨询

免费通话

24h咨询:4006964355


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部