javascript如何实现排序_有哪些排序算法【教程】
发布时间 - 2026-01-28 00:00:00 点击率:次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
# 排序算法
# 为什么
# Array
# sort
# 字符串
# 对象
# prototype
# 算法
# 递归
# 自定义
# 的是
# 这是
# 升序
# 都不
# 你在
# 就得
# 真有
# 不能用
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel如何与Vue.js集成_Laravel + Vue前后端分离项目搭建指南
如何快速生成专业多端适配建站电话?
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
北京网站制作公司哪家好一点,北京租房网站有哪些?
如何快速查询网站的真实建站时间?
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
WordPress 子目录安装中正确处理脚本路径的完整指南
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel模型事件有哪些_Laravel Model Event生命周期详解
python中快速进行多个字符替换的方法小结
html5如何实现懒加载图片_ intersectionobserver api用法【教程】
Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】
如何做网站制作流程,*游戏网站怎么搭建?
简单实现Android文件上传
Laravel怎么在Blade中安全地输出原始HTML内容
javascript中的try catch异常捕获机制用法分析
移动端脚本框架Hammer.js
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
香港服务器租用费用高吗?如何避免常见误区?
Laravel如何生成URL和重定向?(路由助手函数)
佐糖AI抠图怎样调整抠图精度_佐糖AI精度调整与放大细化操作【攻略】
HTML 中动态设置元素 name 属性的正确语法详解
七夕网站制作视频,七夕大促活动怎么报名?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
网站制作软件有哪些,制图软件有哪些?
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
Laravel怎么防止CSRF攻击_Laravel CSRF保护中间件原理与实践
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】
Laravel定时任务怎么设置_Laravel Crontab调度器配置
Laravel如何处理和验证JSON类型的数据库字段
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
nginx修改上传文件大小限制的方法
如何快速建站并高效导出源代码?
jimdo怎样用html5做选项卡_jimdo选项卡html5实现与切换效果【指南】
免费视频制作网站,更新又快又好的免费电影网站?
如何在宝塔面板中修改默认建站目录?
韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐
如何解决hover在ie6中的兼容性问题
Laravel PHP版本要求一览_Laravel各版本环境要求对照
如何快速生成ASP一键建站模板并优化安全性?
Python文件流缓冲机制_IO性能解析【教程】
Laravel如何处理表单验证?(Requests代码示例)
laravel服务容器和依赖注入怎么理解_laravel服务容器与依赖注入解析
米侠浏览器网页背景异常怎么办 米侠显示修复
制作旅游网站html,怎样注册旅游网站?
Laravel如何集成Inertia.js与Vue/React?(安装配置)


