如何用JavaScript实现一个简单的排序算法_冒泡和快速排序如何编写?


冒泡排序通过相邻元素比较交换使最大值逐轮上浮,最多n-1轮,可提前终止;快速排序采用分治法,选基准划分数组后递归排序左右子数组,核心为双指针分区。

冒泡排序和快速排序是两种经典排序算法,JavaScript 实现起来都不难,关键在于理解逻辑和边界处理。

冒泡排序:相邻比较,大数上浮

每次遍历把当前未排序部分的最大值“冒泡”到末尾,重复直到全部有序。

  • 外层循环控制排序轮数(最多 n-1 轮)
  • 内层循环做相邻比较,每轮可减少一次比较(因为末尾已有序)
  • 可加优化:若某轮没发生交换,说明已有序,提前退出
function bubbleSort(arr) {
  const a = [...arr]; // 不修改原数组
  const n = a.length;
  for (let i = 0; i < n - 1; i++) {
    let swapped = false;
    for (let j = 0; j < n - 1 - i; j++) {
      if (a[j] > a[j + 1]) {
        [a[j], a[j + 1]] = [a[j + 1], a[j]]; // 解构交换
        swapped = true;
      }
    }
    if (!swapped) break; // 提前结束
  }
  return a;
}

快速排序:分治递归,基准划分

选一个基准(pivot),把数组分为“小于基准”“大于等于基准”两部分,再递归排序这两部分。

  • 基准可选首元素、末元素或中间元素;简单起见常取中间或末尾
  • 分区(partition)是核心:用双指针把小元素放左、大元素放右
  • 递归终止条件:子数组长度 ≤ 1
function quickSort(arr) {
  if (arr.length <= 1) return arr;
  const pivot = arr[Math.floor(arr.length / 2)];
  const left = [], right = [], equal = [];

for (const x of arr) { if (x < pivot) left.push(x); else if (x > pivot) right.push(x); else equal.push(x); }

return [...quickSort(left), ...equal, ...quickSort(right)]; }

这是“简洁版”,易懂但额外用了空间。进阶可写原地分区(Lomuto 或 Hoare 分区方案),节省内存。

对比与使用建议

  • 冒泡排序时间复杂度 O(n²),仅适合教学或极小数组(如
  • 快速排序平均 O(n log n),实际性能好,但最坏(已排序时)退化为 O(n²);可用随机选基准缓解
  • 生产环境优先用 Array.prototype.sort()(V8 引擎底层混合了快排、插入和堆排)
  • 自己实现时注意:避免直接修改原数组,测试边界 case(空数组、单元素、重复值、已排序)

基本上就这些。写出来不复杂,但细节(比如循环边界、递归出口、是否稳定)容易忽略。


# javascript  # java  # app  # 排序算法  # 冒泡排序 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 网络优化76771 】 【 技术知识130152 】 【 IDC云计算60162 】 【 营销推广131313 】 【 AI优化88182 】 【 百度推广37138 】 【 网站推荐60173 】 【 精选阅读31334


相关推荐: Win10怎么创建桌面快捷方式 Win10为应用创建快捷方式【步骤】  c++如何实现一个高性能的环形队列(Ring Buffer)_c++无锁实现方法【并发】  php下载安装后memory_limit怎么设置_内存限制调整【技巧】  Windows蓝屏错误0x00000018怎么处理_驱动初始化错误解决  Python lxml的etree和ElementTree有什么区别  c# await 一个已经完成的Task会发生什么  Win11怎么设置开机自动连接宽带_Windows11创建拨号连接计划任务  PHP接收参数长度超限怎么办_修改postmaxsize设置教程【解答】  如何解决Windows字体显示模糊的问题?(ClearType设置)  Win11怎么卸载Photos应用_Win11卸载Photos应用方法【教程】  Win11如何更改任务栏颜色 Win11自定义任务栏背景色【美化】  如何在Golang中编写异步函数测试_Golang异步操作测试策略  Win11怎么更改文件夹图标_自定义Win11文件夹外观样式【详解】  Django 测试数据库表缺失与字段未创建问题的完整解决方案  如何用::实现工具类方法调用_php静态工具类设计技巧【技巧】  php会话怎么开启_session_start函数的作用与使用时机【方法】  c++怎么编写动态链接库dll_c++ __declspec(dllexport)导出与调用【方法】  windows 10应用商店区域怎么改_windows 10微软商店切换地区方法  如何使用Golang实现负载均衡_分发请求到多个服务节点  Win11输入法切换快捷键怎么改_Windows 11自定义语言切换键位【教程】  PHP主流架构如何做单元测试_工具与流程【详解】  Win11怎么更改管理员名字 Win11修改账户名称详细步骤【教程】  如何从 Go 的 map[string]interface{} 中安全获取值  如何将文本文件中的竖排字符串转换为横排字符串  php能控制zigbee模块吗_php通过串口与cc2530 zigbee通信【介绍】  如何有效拦截拼接式恶意域名的垃圾信息  如何解决Windows时间不准的问题?(自动同步设置)  Win10电脑怎么设置IP地址_Windows10网络属性固定IP配置  Mac的“调度中心”与“空间”怎么用_Mac多桌面高效管理【技巧】  Windows 11怎么设置默认解压软件_Windows 11为ZIP/RAR文件指定默认打开程序  Mac如何使用听写功能_Mac语音输入打字【效率技巧】  Windows服务持续崩溃怎样修复_系统服务保护机制解析  PHP怎么接收URL中的锚点参数_获取#后面参数值的技巧【详解】  Win10怎样卸载自带Edge_Win10卸载Edge浏览器步骤【教程】  Win11怎么设置组合键快捷方式_Windows11自定义快捷键操作  Win11怎样彻底卸载自带应用_Win11彻底卸载自带应用方法【步骤】  跨文件调用类方法怎么用_php作用域操作符与自动加载配合【介绍】  c# 在高并发场景下,委托和接口调用的性能对比  c++的位运算怎么用 与、或、异或、移位操作详解【底层知识】  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  Go语言中slice追加操作的底层共享机制解析  Win11怎么更改任务栏位置_修改注册表将Win11任务栏置顶【教程】  c++的static关键字有什么用 静态变量和静态函数的应用场景【教程】  为什么Go建议使用error接口作为错误返回_Go Error接口设计原因说明  Windows 10怎么隐藏特定更新补丁_Windows 10使用微软官方工具wushowhide.diagcab  c++ reinterpret_cast怎么用 c++最危险的类型转换【详解】  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  Win11截图快捷键是什么_Win11自带截图工具使用技巧【汇总】  Windows10电脑怎么连接蓝牙设备_Win10蓝牙配对失败解决方法  Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置 

 2025-12-14

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

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

点击免费数据支持

提交您的需求,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.