javascript排序算法如何实现_有哪些常见的排序方法


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, ...quickSort(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)
  • 原生 sort 是不稳定排序(ECMAScript 规范未保证稳定性),如需稳定,优先选归并排序或用索引辅助


# 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

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

致胜网络推广营销网


致胜网络推广营销网

致胜网络推广营销网专注海外推广十年,是谷歌推广.Facebook广告全球合作伙伴,我们精英化的技术团队为企业提供谷歌海外推广+外贸网站建设+网站维护运营+Google SEO优化+社交营销为您提供一站式海外营销服务。

 915688610

 17370845950

 915688610@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.