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

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.xdnf.cn/news/17583.html

相关文章:

  • 打靶日常-upload-labs(21关)
  • 【密码学】8. 密码协议
  • Android 开发问题:Invalid id; ID definitions must be of the form @+id/ name
  • 【系统分析师】软件需求工程——第11章学习笔记(上)
  • A#语言详解
  • GitHub上为什么采用Gradle编译要多于Maven
  • 【走进Docker的世界】深入理解Docker网络:从模式选择到实战配置
  • AI质检数据准备利器:基于Qt/QML 5.14的图像批量裁剪工具开发实战
  • 【代码随想录day 15】 力扣 404. 左叶子之和
  • nginx+Lua环境集成、nginx+Lua应用
  • 自动化备份全网服务器数据平台
  • UE材质World Position 和 Object Position
  • Linux操作系统从入门到实战(十七)进程与进程基本概念
  • Redis一站式指南一:从MySQL事务到Redis持久化及事务实现
  • Error: error:0308010C:digital envelope routines::unsupported at new Hash
  • 计算机视觉(CV)——pytorch张量基本使用
  • 青龙峡拔韭菜
  • 【东枫科技】NTN-IOT 卫星互联网原型系统,高达1.6G大带宽
  • 免费数字人API开发方案
  • 使用正则表达式检测Base64字符串并提取图片类型及正文的JavaScript函数,代码精简且高效
  • How Websites Work 网站如何运作
  • Linux入门指南:26个基础命令全解析
  • C语言(长期更新)第10讲:操作符详解(二)
  • vue3项目中在一个组件中点击了该组件中的一个按钮,那么如何去触发另一个组件中的事件?
  • playwright-mcp 项目全解析:从理论到实践
  • 量子计算机实用化:从理论到现实的艰难跨越
  • (一)Tailwindcss
  • Win10清理C盘步骤
  • Spring事务失效的常见原因
  • ROS2 QT 多线程功能包设计