JavaScript排序需手写以避免sort()默认字符串排序错误;冒泡排序稳定但慢,快排平均O(n log n)但不稳定,归并排序稳定且复杂度恒定O(n log n),原生sort不稳定,对象排序需自定义比较函数。
JavaScript 中实现排序算法,核心是理解每种算法的逻辑,并用 JS 语法表达出来。数组的 sort() 方法虽方便,但默认按字符串 Unicode 码点排序,处理数字时容易出错(如 [10, 2, 33].sort() 得到 [10, 2, 33]),所以掌握手写排序对理解数据结构、调试和面试都很重要。
原理是重复遍历数组,两两比较相邻元素,把较大(或较小)的“浮”到一端。每轮确定一个极值位置,共需 n−1 轮。
关键点:外层控制轮数,内层控制比较范围(每轮减少一个末位);可加优化——若某轮无交换,说明已有序,提前退出。
示例代码:
function bubbleSort(arr) {
const res = [...arr];
const n = res.length;
for (let i = 0; i < n - 1; i++) {
let swapped = false;
for (let j = 0; j < n - 1 - i; j++) {
if (res[j] > res[j + 1]) {
[res[j], res[j + 1]] = [res[j + 1], res[j]];
swapped = true;
}
}
if (!swapped) break;
}
return res;
}
选一个基准值(pivot),将数组分为三部分:小于 pivot、等于 pivot、大于 pivot,再递归排序前后两部分。平均时间复杂度 O(n log n),原地排序但不稳定。
注意:避免最坏情况(已排序数组选首/尾为 pivot → O(n²)),可用随机选 pivot 或三数取中法优化。
简洁实现(非原地):
function quickSort(arr) {
if (arr.length <= 1) return arr;
const pivot = arr[Math.floor(Math.random() * arr.length)];
const left = arr.filter(x => x < pivot);
const mid = arr.filter(x => x === pivot);
const right = arr.filter(x => x > pivot);
return [...quickSort(left), ...mid, ...quickS
ort(right)];
}
先递归拆分数组至单元素,再两两合并(合并时保持有序)。时间复杂度稳定 O(n log n),但需要 O(n) 额外空间。
合并操作是重点:用两个指针分别遍历左右子数组,取较小值推入结果,剩余部分直接拼接。
示例:
function mergeSort(arr) {
if (arr.length <= 1) return arr;
const mid = Math.floor(arr.length / 2);
const left = mergeSort(arr.slice(0, mid));
const right = mergeSort(arr.slice(mid));
return merge(left, right);
}
function merge(left, right) {
let result = [];
let i = 0, j = 0;
while (i < left.length && j < right.length) {
if (left[i] <= right[j]) {
result.push(left[i++]);
} else {
result.push(right[j++]);
}
}
return result.concat(left.slice(i)).concat(right.slice(j));
}
JavaScript 开发中不总需要手写排序,但要会用对、调得准:
[3, 1, 10].sort((a, b) => a - b),避免字符串误排users.sort((a, b) => a.age - b.age) 或用 localeCompare() 处理字符串(a, b) => b.score - a.score || a.name.localeCompare(b.name)
# javascript
# java
# js
# 大数据
# app
# 排序算法
# 冒泡排序
相关栏目:
【
Google疑问12 】
【
Facebook疑问10 】
【
网络优化76771 】
【
技术知识130152 】
【
IDC云计算60162 】
【
营销推广131313 】
【
AI优化88182 】
【
百度推广37138 】
【
网站推荐60173 】
【
精选阅读31334 】
相关推荐:
Win11怎么关闭自动更新 Win11永久关闭系统更新的有效方法【技巧】
如何使用Golang实现路由分组管理_Golang路由分组与权限控制方法
Python项目维护经验_长期演进说明【指导】
Windows电脑键盘突然失灵怎么办?(驱动与硬件排查)
Win11怎么关闭搜索历史 Win11清除搜索框最近记录【隐私】
Python性能剖析高级教程_cProfileLineProfiler优化案例解析
Win11怎么关闭系统声音_Win11系统提示音静音设置【详解】
如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】
Win11摄像头无法使用怎么办_Win11相机隐私权限开启教程【详解】
如何解决Windows字体显示模糊的问题?(ClearType设置)
Win11怎样安装微信开发者工具_Win11安装开发者工具教程【步骤】
Django 测试数据库表缺失与字段未创建问题的完整解决方案
如何提升Golang JSON序列化性能_Golang JSON编码效率优化方法
如何在Golang中实现文件下载_Golang文件传输与内容类型处理方法
Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】
Windows家庭版如何开启组策略(gpedit.msc)?(安装方法)
c++中如何使用auto关键字_c++11类型推导用法说明
Python大文件处理策略_内存优化说明【指导】
短链接怎么自定义还原php_修改解码规则适配需求【汇总】
Python字符串操作教程_切片拼接与格式化详解
mac怎么分屏_MAC双屏显示与分屏操作技巧【指南】
TestNG的testng.xml配置文件怎么写
如何在 Go 项目开发中正确处理本地包导入与远程模块路径的一致性问题
如何关闭Win10自动更新更新_Win10系统自动更新双重关闭技巧
Go 语言标准库为何不提供泛型 Contains 方法?
Win11怎么更改文件夹图标_自定义Win11文件夹外观样式【详解】
Win11怎么设置默认图片查看器_Windows11照片应用关联设置
如何使用Golang管理模块版本_Golanggo mod tidy与升级方法
为什么Go需要go mod文件_Go go mod文件作用说明
Windows10系统更新错误0x80070002_Win10自动更新失败手动修复
Python解释执行模型_字节码流程说明【指导】
Win10如何设置双wan路由器 Win10双wan路由器设置方法【指南】
c++20的std::format怎么用 比printf更安全高效的格式化方法【详解】
Windows 11如何开启文件夹加密(EFS)_Windows 11文件属性中加密内容以保护数据
Win11怎么设置默认终端应用_Windows11开发者选项终端
php修改数据怎么批量改状态_批量更新status字段值技巧【操作】
Win11怎么查看硬盘型号_Windows 11检测硬盘信息方法【技巧】
Win11屏幕亮度突然变暗怎么解决_自动变暗问题处理
Windows10系统怎么查看CPU核心数_Win10逻辑处理器数量查看
c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】
LINUX怎么设置系统语言_LINUX修改中文环境
c++怎么操作redis数据库_c++ hiredis库连接与命令执行【实战】
Win10怎样安装Word样式库_Win10安装Word样式教程【步骤】
c++如何使用std::bind绑定函数参数_c++ 占位符std::placeholders使用【详解】
如何用::实现单例模式_php静态方法与作用域操作符应用【技巧】
Win11怎么清理C盘虚拟内存_Win11清理虚拟内存设置【教程】
Mac怎么开启“任何来源”_Mac安装未签名应用的设置方法【解决】
VSC里PHP变量未定义报错怎么解决_错误抑制技巧【解答】
Win11怎么设置ipv4地址_Windows 11固定静态IP地址配置教程【详解】
如何外贸网站设计-能留住客户提升用户体验!
2025-12-23
致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。