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; ?>
】
相关推荐
- Windows如何查看和管理已安装的字体?(字体文
- Win11怎样安装钉钉客户端_Win11安装钉钉教
- 如何在 Django 中安全修改用户密码而不使会话
- c++如何用AFL++进行模糊测试 c++ Fuz
- Win11如何设置系统声音_Win11系统声音调整
- 如何在 Go 中可靠地测试含 time.Time
- C++中引用和指针有什么区别?(代码说明)
- c++怎么使用std::filesystem遍历文
- Linux如何使用grep搜索文件内容_Linux
- Windows怎样拦截QQ浏览器广告_Window
- Win11怎么设置屏保时间_调整Win11屏幕保护
- Win11怎么开启智能存储_Windows11存储
- Windows10如何更改系统字体大小_Win10
- Windows电脑键盘突然失灵怎么办?(驱动与硬件
- php怎么操作Redis_Redis扩展连接与基本
- Win11怎么关闭任务栏小组件_Windows11
- 如何在Golang中修改数组元素_通过指针实现原地
- 如何在Golang中实现RPC异步返回_Golan
- Mac如何彻底清理浏览器缓存?(Safari与Ch
- Win11怎么退出微软账户_切换Win11为本地账
- Win11怎么设置应用分屏_Windows11贴靠
- php错误怎么开启_display_errors与
- Win11无法拖拽文件到任务栏怎么办_Win11开
- MySQL 中使用 IF 和 CASE 实现查询字
- Mac如何使用听写功能_Mac语音输入打字【效率技
- Windows 11怎么更改锁屏超时时间_Wind
- 如何在Golang中处理云原生事件_使用Event
- Windows10如何彻底关闭自动更新_Win10
- 如何在 IIS 上为 ASP.NET 6 应用排除
- Win11怎么设置开机问候语_自定义Win11锁屏
- Win11怎么设置默认浏览器Chrome_Wind
- Python网页解析流程_html结构说明【指导】
- 如何使用Golang table-driven基准
- Windows10如何更改鼠标图标_Win10鼠标
- 如何使用Golang包导出规则_控制函数和变量可见
- windows如何禁用驱动程序强制签名_windo
- php8.4如何配置ssl证书_php8.4htt
- C#怎么使用委托和事件 C# delegate与e
- PHP主流架构怎么集成Redis缓存_配置步骤【方
- Python大文件处理策略_内存优化说明【指导】
- 如何解决同一段404代码在不同主机上表现不一致的问
- Linux怎么禁止Root用户远程登录_Linux
- Win11怎么关闭OneDrive同步_Win11
- c++怎么实现大文件的分块读写_c++ 文件指针s
- 如何使用Golang log设置日志输出格式_Go
- Win11怎样安装搜狗输入法_Win11安装搜狗输
- Win11怎么连接蓝牙耳机_Win11蓝牙设备配对
- 如何使用Golang实现路由分组管理_Golang
- Win11声音忽大忽小怎么办 Win11音频增强功
- Win11怎么打开旧版计算器_Win11恢复传统计


QQ客服