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

排序算法 (Sorting Algorithms)-JS示例

基本概念

排序算法是将一组数据按照特定顺序(通常是升序或降序)重新排列的算法。它是计算机科学中最基础也是最重要的算法之一。

核心特性

  • 稳定性:相等元素在排序后的相对位置不变
  • 时间复杂度:算法执行所需的时间
  • 空间复杂度:算法执行所需的额外存储空间
  • 原地排序:只需要常数级额外空间的排序算法

常见分类

  1. 比较排序:通过比较元素大小来决定顺序(如冒泡排序、快速排序)
  2. 非比较排序:不通过比较元素大小(如计数排序、桶排序)

经典排序算法 JS 示例

1. 冒泡排序 (Bubble Sort)

function bubbleSort(arr) {const n = arr.length;// 创建数组副本以避免修改原数组const result = [...arr];for (let i = 0; i < n - 1; i++) {let swapped = false;// 每轮将最大元素"冒泡"到末尾for (let j = 0; j < n - i - 1; j++) {if (result[j] > result[j + 1]) {// 交换元素[result[j], result[j + 1]] = [result[j + 1], result[j]];swapped = true;}}// 如果没有发生交换,说明数组已经有序if (!swapped) break;}return result;
}// 示例使用
const arr1 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr1);
console.log('冒泡排序结果:', bubbleSort(arr1));

2. 选择排序 (Selection Sort)

function selectionSort(arr) {const n = arr.length;const result = [...arr];for (let i = 0; i < n - 1; i++) {// 找到未排序部分的最小元素索引let minIndex = i;for (let j = i + 1; j < n; j++) {if (result[j] < result[minIndex]) {minIndex = j;}}// 将最小元素与未排序部分的第一个元素交换if (minIndex !== i) {[result[i], result[minIndex]] = [result[minIndex], result[i]];}}return result;
}// 示例使用
const arr2 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr2);
console.log('选择排序结果:', selectionSort(arr2));

3. 插入排序 (Insertion Sort)

function insertionSort(arr) {const result = [...arr];for (let i = 1; i < result.length; i++) {const key = result[i];let j = i - 1;// 将大于key的元素向右移动while (j >= 0 && result[j] > key) {result[j + 1] = result[j];j--;}result[j + 1] = key;}return result;
}// 示例使用
const arr3 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr3);
console.log('插入排序结果:', insertionSort(arr3));

4. 快速排序 (Quick Sort)

function quickSort(arr) {if (arr.length <= 1) {return arr;}const pivot = arr[Math.floor(arr.length / 2)];const left = [];const right = [];const equal = [];for (let element of arr) {if (element < pivot) {left.push(element);} else if (element > pivot) {right.push(element);} else {equal.push(element);}}return [...quickSort(left), ...equal, ...quickSort(right)];
}// 原地快速排序版本
function quickSortInPlace(arr, low = 0, high = arr.length - 1) {if (low < high) {const pi = partition(arr, low, high);quickSortInPlace(arr, low, pi - 1);quickSortInPlace(arr, pi + 1, high);}return arr;
}function partition(arr, low, high) {const pivot = arr[high];let i = low - 1;for (let j = low; j < high; j++) {if (arr[j] < pivot) {i++;[arr[i], arr[j]] = [arr[j], arr[i]];}}[arr[i + 1], arr[high]] = [arr[high], arr[i + 1]];return i + 1;
}// 示例使用
const arr4 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr4);
console.log('快速排序结果:', quickSort([...arr4]));

5. 归并排序 (Merge Sort)

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) {const result = [];let leftIndex = 0;let rightIndex = 0;// 合并两个已排序的数组while (leftIndex < left.length && rightIndex < right.length) {if (left[leftIndex] < right[rightIndex]) {result.push(left[leftIndex]);leftIndex++;} else {result.push(right[rightIndex]);rightIndex++;}}// 添加剩余元素return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
}// 示例使用
const arr5 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr5);
console.log('归并排序结果:', mergeSort(arr5));

6. 堆排序 (Heap Sort)

function heapSort(arr) {const result = [...arr];const n = result.length;// 构建最大堆for (let i = Math.floor(n / 2) - 1; i >= 0; i--) {heapify(result, n, i);}// 逐个提取元素for (let i = n - 1; i > 0; i--) {[result[0], result[i]] = [result[i], result[0]]; // 将当前最大元素移到末尾heapify(result, i, 0); // 重新调整堆}return result;
}function heapify(arr, n, i) {let largest = i;const left = 2 * i + 1;const right = 2 * i + 2;if (left < n && arr[left] > arr[largest]) {largest = left;}if (right < n && arr[right] > arr[largest]) {largest = right;}if (largest !== i) {[arr[i], arr[largest]] = [arr[largest], arr[i]];heapify(arr, n, largest);}
}// 示例使用
const arr6 = [64, 34, 25, 12, 22, 11, 90];
console.log('原数组:', arr6);
console.log('堆排序结果:', heapSort(arr6));
http://www.dtcms.com/a/303126.html

相关文章:

  • 安装及使用vscode
  • Unity教程(二十四)技能系统 投剑技能(中)技能变种实现
  • 【Unity游戏】——1.俄罗斯方块
  • Apache Ignite的分布式计算(Distributed Computing)
  • 基于Milvus和BGE-VL模型实现以图搜图
  • 第17章——多元函数积分学的预备知识
  • odoo欧度小程序——修改用户和密码
  • RabbitMQ+内网穿透远程访问教程:实现异地AMQP通信+Web管理
  • 基于springboot的大创管理系统(源码+论文+开题报告)
  • 项目任务如何分配?核心原则
  • 银行个人贷款接受度分析
  • el-upload开启picture形式列表展示上传的非图片文件自定义缩略图
  • 网络层描述
  • Leetcode_349.两个数组的交集
  • Word VBA快速制作试卷(2/2)
  • 【华为机试】5. 最长回文子串
  • 学习人工智能所需知识体系及路径详解
  • 记录几个SystemVerilog的语法——随机
  • 五自由度磁悬浮轴承转子:基于自适应陷波器的零振动攻克不平衡质量扰动的终极策略
  • (45) QT 提供了一个功能,以同步现代操作系统的编辑功能,在标题栏上显示 * 占位符,以显示窗体上发生了未被保存的修改
  • 三维插件 Forest 深度解析:打造高效逼真的自然环境
  • 命令执行漏洞
  • 计算机毕设分享-基于SpringBoot的健身房管理系统(开题报告+前后端源码+Lun文+开发文档+数据库设计文档)
  • USRP-X440 雷达目标发生器
  • 深入解析 Java Stream 设计:从四幕剧看流水线设计与执行机制
  • 对于ui=f(state)的理解(react)
  • Redis四种GetShell方式完整教程
  • 使用Docker在Rocky Linux 9.5上在线部署LangFlow
  • 【STM32编码器接口测速】实现测速功能
  • 删除二维特征图中指定区域的样本