news 2026/3/22 8:17:39

JavaScript 中常用排序方法的性能对比和分析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
JavaScript 中常用排序方法的性能对比和分析

一、原生数组排序方法

1.Array.prototype.sort()

javascript

// 默认排序(按字符串Unicode码点) arr.sort() // 自定义比较函数 arr.sort((a, b) => a - b) // 数字升序
  • 时间复杂度

    • V8引擎:使用Timsort(归并+插入)

    • 平均/最坏情况:O(n log n)

    • 最佳情况:O(n)

  • 空间复杂度:O(n)(稳定排序需要额外空间)

  • 特点:稳定排序,适合大多数场景


二、经典排序算法实现

2.快速排序

javascript

function quickSort(arr) { if (arr.length <= 1) return arr; const pivot = arr[Math.floor(arr.length / 2)]; const left = arr.filter(x => x < pivot); const middle = arr.filter(x => x === pivot); const right = arr.filter(x => x > pivot); return quickSort(left).concat(middle, quickSort(right)); }
  • 平均时间复杂度:O(n log n)

  • 最坏情况:O(n²)(已排序数组)

  • 空间复杂度:O(log n) ~ O(n)

  • 特点:原地排序,不稳定

3.归并排序

javascript

function mergeSort(arr) { if (arr.length <= 1) return arr; const mid = Math.floor(arr.length / 2); return merge(mergeSort(arr.slice(0, mid)), mergeSort(arr.slice(mid))); }
  • 时间复杂度:O(n log n)

  • 空间复杂度:O(n)

  • 特点:稳定排序,适合链表

4.堆排序

javascript

function heapSort(arr) { // 建堆 for (let i = Math.floor(arr.length / 2) - 1; i >= 0; i--) { heapify(arr, arr.length, i); } // 排序 for (let i = arr.length - 1; i > 0; i--) { [arr[0], arr[i]] = [arr[i], arr[0]]; heapify(arr, i, 0); } return arr; }
  • 时间复杂度:O(n log n)

  • 空间复杂度:O(1)

  • 特点:原地排序,不稳定


三、简单但低效的排序

5.冒泡排序

javascript

function bubbleSort(arr) { for (let i = 0; i < arr.length; i++) { for (let j = 0; j < arr.length - i - 1; j++) { if (arr[j] > arr[j + 1]) { [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]; } } } return arr; }
  • 时间复杂度:O(n²)

  • 特点:实现简单,适合教学


6.插入排序

javascript

function insertionSort(arr) { for (let i = 1; i < arr.length; i++) { let key = arr[i]; let j = i - 1; while (j >= 0 && arr[j] > key) { arr[j + 1] = arr[j]; j--; } arr[j + 1] = key; } return arr; }
  • 最佳情况:O(n)(已排序)

  • 最坏情况:O(n²)

  • 特点:对小数组或基本有序数组高效


四、性能对比数据

以下是在 Chrome 119 中对 10,000 个随机整数的测试结果:

排序方法平均时间(ms)相对速度
原生 sort()1-3最快
快速排序5-10≈2-3倍慢
归并排序8-15≈3-5倍慢
堆排序10-20≈4-7倍慢
插入排序150-300≈50-100倍慢
冒泡排序400-800≈150-300倍慢

五、选择建议

1.日常使用

javascript

// 99% 的场景使用原生 sort arr.sort((a, b) => a - b);

2.特殊场景

  • 小数组 (n < 10):插入排序可能更快

  • 几乎有序的数据:插入排序或冒泡排序

  • 内存敏感:堆排序(原地排序)

  • 需要稳定性:归并排序或 Timsort


3.现代 JavaScript 优化

javascript

// 使用 TypedArray 提高数值排序性能 const float64Array = new Float64Array([3, 1, 2]); float64Array.sort(); // 使用高度优化的底层实现 // Web Workers 并行处理大数据 if (window.Worker) { const worker = new Worker('sort-worker.js'); worker.postMessage(largeArray); }

关联阅读推荐

TypedArray 详解


什么是 TypedArray

TypedArray是 JavaScript 中处理二进制数据的对象,它提供了类似数组的视图来访问原始二进制缓冲区中的数据。

核心特点:
  • 类型化:每个元素都有固定的数据类型(如 Int8、Uint32、Float64 等)

  • 高性能:直接操作内存,避免了 JavaScript 对象的开销

  • 固定长度:创建后长度不可变

  • 内存高效:数据在内存中连续存储

TypedArray 类型
类型字节长度数值范围描述
Int8Array1-128 ~ 1278位有符号整数
Uint8Array10 ~ 2558位无符号整数
Uint8ClampedArray10 ~ 2558位无符号整数(限制范围)
Int16Array2-32768 ~ 3276716位有符号整数
Uint16Array20 ~ 6553516位无符号整数
Int32Array4-2³¹ ~ 2³¹-132位有符号整数
Uint32Array40 ~ 2³²-132位无符号整数
Float32Array4±1.2×10⁻³⁸ ~ ±3.4×10³⁸32位浮点数
Float64Array8±5.0×10⁻³²⁴ ~ ±1.8×10³⁰⁸64位浮点数
BigInt64Array8-2⁶³ ~ 2⁶³-164位有符号大整数
BigUint64Array80 ~ 2⁶⁴-164位无符号大整数

4.实际考虑因素

javascript

// 根据数据特性选择 function smartSort(arr) { if (arr.length < 10) { return insertionSort(arr); } else if (isAlmostSorted(arr)) { return bubbleSort(arr); } else { return arr.sort((a, b) => a - b); } }

六、最佳实践总结

  1. 优先使用Array.prototype.sort()- V8 的 Timsort 高度优化

  2. 避免自己实现排序算法- 除非有特殊需求

  3. 考虑数据特征- 数据量、有序程度、数据类型

  4. 使用适当的数据结构- 有时不需要排序,用 Map/Set 更高效

  5. 大数据集考虑分治- 分批排序或使用 Web Workers


原生sort()方法在绝大多数情况下都是最佳选择,除非你有明确的性能瓶颈和特殊需求。


关联阅读推荐

JavaScript 原生 sort() 方法详解

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/14 5:19:04

BioSIM 抗人 IL-1b 抗体SIM0362:多种应用兼容性,适应多样化实验需求

在免疫学与炎症研究领域&#xff0c;IL-1b&#xff08;白细胞介素-1b&#xff09;作为关键的促炎因子&#xff0c;其作用机制和调控方式一直是科研关注的焦点。为了更好地理解这一重要分子的功能&#xff0c;研究人员需要高度特异、性能稳定的抗体工具。BioSIM 抗人 IL-1b 抗体…

作者头像 李华
网站建设 2026/3/13 0:35:35

清理linux大文件

最近我有几台机器的日志太多了。。。也不是重要系统可以删掉log文件。删到最后没有可以删除的了。于是使用了 find /path/to/directory -type f -size 100M查出来发现是docker的日志太大了&#xff0c;这个日志一直都是默认状态&#xff0c;所以一直都没有进行处理。 truncat…

作者头像 李华
网站建设 2026/3/21 5:47:06

纸质档案存隐患?档案宝全生命周期电子化管理

在企业日常运营中&#xff0c;档案管理是不可或缺的基础工作&#xff0c;合同文件、财务凭证、人事资料、项目报告等各类档案承载着组织的核心信息&#xff0c;其管理质量直接影响企业运营效率与风险防控能力。然而&#xff0c;传统纸质档案管理模式长期以来存在诸多难以解决的…

作者头像 李华
网站建设 2026/3/17 9:12:26

Python+AI 打造每日新闻简报应用(聚合热搜 + 智能摘要 + 语音播报)

一、教程概述 本教程将带你从零搭建一款 AI 驱动的每日新闻简报应用「Briefy」&#xff0c;核心功能包括聚合多平台热搜、AI 智能摘要、语音播报&#xff0c;最终实现 “5 分钟掌握全网热点” 的高效信息获取工具。适合有 Python 基础、对 AI 应用开发感兴趣的开发者&#xff…

作者头像 李华
网站建设 2026/3/12 20:56:46

JUnit 5 中的 @ClassTemplate 实战指南

当你在本地、测试环境和 CI 中跑同一组测试时&#xff0c;是否遇到过这样的困惑&#xff1a;同一段业务逻辑在不同配置、不同 Locale 下的表现不尽相同&#xff0c;但你又不想为每种场景复制一堆几乎一样的测试类&#xff1f;如果把所有分支逻辑都塞进一个测试方法里&#xff0…

作者头像 李华
网站建设 2026/3/16 11:32:01

Parasoft Jtest 如何用 JSON 文件驱动Java 测试自动化

在金融、汽车、医疗等对可靠性与合规性要求较高的行业&#xff0c;Java 应用中的代码缺陷可能直接导致资金损失、服务中断或监管处罚。Parasoft Jtest 是一款企业级 Java 自动化测试平台&#xff0c;支持静态代码分析、智能单元测试生成、代码覆盖率评估以及合规规则检查。其内…

作者头像 李华