当前位置: 首页 > news >正文

JS数组排序算法

1. 冒泡排序(Bubble Sort)

原理

  • 从数组头开始,两两比较相邻元素,若顺序错误(比如升序时前面大于后面),就交换它们。
  • 每一趟会把当前未排序部分的最大(或最小)元素“冒泡”到末尾。
  • 重复多趟,直到整个数组有序。

代码示例

function bubbleSort(arr) {let len = arr.length;for (let i = 0; i < len - 1; i++) {// 每趟冒泡,把最大值放到末尾for (let j = 0; j < len - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 交换let temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}return arr;
}
  • 时间复杂度
    • 平均和最坏:O(n²)
    • 最好(数组已基本有序):O(n)
  • 优缺点
    • 简单易懂,代码短。
    • 性能较差,尤其大数据量时效率低。
    • 稳定排序(相等元素顺序不变)。

2. 插入排序(Insertion Sort)

原理

  • 把数组分成已排序和未排序两部分。
  • 每次取未排序的第一个元素,插入到已排序部分的合适位置。
  • 类似打牌时整理手牌的过程。

代码示例

function insertionSortSeparate(arr) {let sorted = []; // 已排序数组let unsorted = arr.slice(); // 未排序数组,复制一份避免修改原数组while (unsorted.length > 0) {let current = unsorted.shift(); // 取出未排序的第一个元素// 找到插入位置let inserted = false;for (let i = 0; i < sorted.length; i++) {if (current < sorted[i]) {// 插入到第i个位置,后面元素依次后移sorted.splice(i, 0, current);inserted = true;break;}}// 如果比所有已排序元素都大,插入到末尾if (!inserted) {sorted.push(current);}}return sorted;
}

简洁版:

function insertionSort(arr) {let len = arr.length;for (let i = 1; i < len; i++) {let key = arr[i];let j = i - 1;// 向左移动已排序元素,为 key 找合适位置while (j >= 0 && arr[j] > key) {arr[j + 1] = arr[j];j--;}arr[j + 1] = key;}return arr;
}
  • 时间复杂度
    • 平均和最坏:O(n²)
    • 最好(几乎有序):O(n)
  • 优缺点
    • 适合部分有序数组,性能比冒泡好一点。
    • 稳定排序。
    • 代码实现稍复杂。

3. 快速排序(Quick Sort)

原理

  • 选择一个“基准”元素(pivot),通常是中间或第一个元素。
  • 把数组分成两部分:小于基准的和大于基准的。
  • 递归地对两部分分别排序。
  • 最后把排好序的左边 + 基准 + 右边拼起来。

代码示例(递归版)

function quickSort(arr) {if (arr.length <= 1) return arr;let pivotIndex = Math.floor(arr.length / 2);let pivot = arr.splice(pivotIndex, 1)[0];let left = [];let right = [];for (let i = 0; i < arr.length; i++) {if (arr[i] < pivot) left.push(arr[i]);else right.push(arr[i]);}return quickSort(left).concat([pivot], quickSort(right));
}
  • 时间复杂度
    • 平均:O(n log n)
    • 最坏(已经有序或逆序):O(n²)
    • 实际上很快,是很多 JS 引擎底层排序的基础
  • 优缺点
    • 快速,适合大数据量排序。
    • 代码稍复杂,递归调用有栈空间消耗。
    • 不稳定排序(相等元素顺序可能变化)。
http://www.dtcms.com/a/324240.html

相关文章:

  • scanpy单细胞转录组python教程(三):单样本数据分析之数据标准化、特征选择、细胞周期计算、回归等
  • 2025.8.10总结
  • 学生成绩管理系统的 SQL 表设计与多表查询实战
  • 部署一个免费开源的博客系统
  • 库的制作和原理
  • 双亲委派机制是什么?
  • 大模型工具集成四层架构:识别、协议、执行与实现
  • reinterpret_cast and static cast
  • Lua的数组、迭代器、table、模块
  • Elasticsearch 搜索模板(Search Templates)把“可配置查询”装进 Mustache
  • 从MySQL到大数据平台:基于Spark的离线分析实战指南
  • 重学React(四):状态管理二
  • Spark执行计划与UI分析
  • 【软考中级网络工程师】知识点之 DCC 深度剖析
  • 系统架构设计师备考之架构设计高级知识
  • 企业高性能web服务器——Nginx
  • App Trace 功能详解 (开发者视角)
  • IDEA 如何导入系统设置
  • 从0到1学LangChain之Agent代理:解锁大模型应用新姿势
  • 【机器学习深度学习】Embedding 模型详解:从基础原理到实际应用场景
  • Xstream反序列化,fastjson,jcakson靶场复现
  • 刑法视野下的虚拟财产属性争议:法律风险与市场潜力解析
  • ThinkPHP8学习篇(二):路由
  • Day39--动态规划--198. 打家劫舍,213. 打家劫舍 II,337. 打家劫舍 III
  • Code Exercising Day 10 of “Code Ideas Record“:StackQueue part02
  • MVCC和日志
  • 国内外主流大模型深度体验与横向评测:技术、场景与未来展望
  • 后置定语:for + 宾语 + 被动不定式
  • CentOS 10在文本控制台模式下修改字体大小
  • 2020/12 JLPT听力原文 问题一