JS 常见排序算法汇总(全)

article/2025/11/9 11:35:53

文章目录

  • 排序算法总结
    • JS 十大排序算法
    • 冒泡排序
    • 单向冒泡
    • 双向冒泡
    • 选择排序
    • 插入排序
    • 快速排序
    • 归并排序
    • 桶排序
    • 基数排序
    • 计数排序

排序算法总结

JS 十大排序算法

排序算法

冒泡排序

作为最简单的排序算法之一,冒泡排序感觉就像Abandon在单词书里出现的感觉一样,每次都在第一页第一位,冒泡排序还有一种优化算法,就是立一个flag,当在一趟序列遍历中元素没有发生交换,则证明该序列已经有序。但这种改进对于提升性能来说并没有什么太大作用。。。

通过相邻元素的比较和交换,使得每一趟循环都能找到未有序数组的最大值或最小值。

最好:O(n),只需要冒泡一次数组就有序了。
最坏:O(n²)
平均:O(n²)

冒泡排序动图演示:

在这里插入图片描述

单向冒泡

function bubbleSort(nums) {for(let i=0, len=nums.length; i<len-1; i++) {// 如果一轮比较中没有需要交换的数据,则说明数组已经有序。主要是对[5,1,2,3,4]之类的数组进行优化let mark = true;for(let j=0; j<len-i-1; j++) {if(nums[j] > nums[j+1]) {[nums[j], nums[j+1]] = [nums[j+1], nums[j]];mark = false;}}if(mark)  return;}
}

双向冒泡

普通的冒泡排序在一趟循环中只能找出一个最大值或最小值,双向冒泡则是多一轮循环既找出最大值也找出最小值。

function bubbleSort_twoWays(nums) {let low = 0;let high = nums.length - 1;while(low < high) {let mark = true;// 找到最大值放到右边for(let i=low; i<high; i++) {if(nums[i] > nums[i+1]) {[nums[i], nums[i+1]] = [nums[i+1], nums[i]];mark = false;}}high--;// 找到最小值放到左边for(let j=high; j>low; j--) {if(nums[j] < nums[j-1]) {[nums[j], nums[j-1]] = [nums[j-1], nums[j]];mark = false;}}low++;if(mark)  return;}
}

选择排序

选择排序须知:
在时间复杂度上表现最稳定的排序算法之一,因为无论什么数据进去都是O(n²)的时间复杂度。。。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

和冒泡排序相似,区别在于选择排序是将每一个元素和它后面的元素进行比较和交换。

最好:O(n²)
最坏:O(n²)
平均:O(n²)

选择排序动图演示:
在这里插入图片描述

代码演示:

function selectSort(nums) {for(let i=0, len=nums.length; i<len; i++) {for(let j=i+1; j<len; j++) {if(nums[i] > nums[j]) {[nums[i], nums[j]] = [nums[j], nums[i]];}}}
}

插入排序

以第一个元素作为有序数组,其后的元素通过在这个已有序的数组中找到合适的位置并插入。

插入排序和冒泡排序一样,也有一种优化算法,叫做拆半插入。

最好:O(n),原数组已经是升序的。
最坏:O(n²)
平均:O(n²)

插入排序动图演示:

在这里插入图片描述

代码演示:

function insertSort(nums) {for(let i=1, len=nums.length; i<len; i++) {let temp = nums[i];let j = i;while(j >= 0 && temp < nums[j-1]) {nums[j] = nums[j-1];j--;}nums[j] = temp;}
}

快速排序

选择一个元素作为基数(通常是第一个元素),把比基数小的元素放到它左边,比基数大的元素放到它右边(相当于二分),再不断递归基数左右两边的序列。

最好:O(n * logn),所有数均匀分布在基数的两边,此时的递归就是不断地二分左右序列。
最坏:O(n²),所有数都分布在基数的一边,此时划分左右序列就相当于是插入排序。
平均:O(n * logn)

快速排序动图演示:
在这里插入图片描述

归并排序

作为一种典型的分而治之思想的算法应用,归并排序的实现由两种方法:

自上而下的递归(所有递归的方法都可以用迭代重写,所以就有了第2种方法)

  1. 自下而上的迭代
  2. 递归将数组分为两个序列,有序合并这两个序列。

最好:O(n * logn)
最坏:O(n * logn)
平均:O(n * logn)

归并排序动图演示:
在这里插入图片描述

桶排序

取 n 个桶,根据数组的最大值和最小值确认每个桶存放的数的区间,将数组元素插入到相应的桶里,最后再合并各个桶。

最好:O(n),每个数都在分布在一个桶里,这样就不用将数插入排序到桶里了(类似于计数排序以空间换时间)。
最坏:O(n²),所有的数都分布在一个桶里。
平均:O(n + k),k表示桶的个数。

function bucketSort(nums) {// 桶的个数,只要是正数即可let num = 5;let max = Math.max(...nums);let min = Math.min(...nums);// 计算每个桶存放的数值范围,至少为1,let range = Math.ceil((max - min) / num) || 1;// 创建二维数组,第一维表示第几个桶,第二维表示该桶里存放的数let arr = Array.from(Array(num)).map(() => Array().fill(0));nums.forEach(val => {// 计算元素应该分布在哪个桶let index = parseInt((val - min) / range);// 防止index越界,例如当[5,1,1,2,0,0]时index会出现5index = index >= num ? num - 1 : index;let temp = arr[index];// 插入排序,将元素有序插入到桶中let j = temp.length - 1;while(j >= 0 && val < temp[j]) {temp[j+1] = temp[j];j--;}temp[j+1] = val;})// 修改回原数组let res = [].concat.apply([], arr);nums.forEach((val, i) => {nums[i] = res[i];})
}

基数排序

使用十个桶 0-9,把每个数从低位到高位根据位数放到相应的桶里,以此循环最大值的位数次。但只能排列正整数,因为遇到负号和小数点无法进行比较。

最好:O(n * k),k表示最大值的位数。
最坏:O(n * k)
平均:O(n * k)

基数排序动图演示:
在这里插入图片描述

代码演示:

function radixSort(nums) {// 计算位数function getDigits(n) {let sum = 0;while(n) {sum++;n = parseInt(n / 10);}return sum;}// 第一维表示位数即0-9,第二维表示里面存放的值let arr = Array.from(Array(10)).map(() => Array());let max = Math.max(...nums);let maxDigits = getDigits(max);for(let i=0, len=nums.length; i<len; i++) {// 用0把每一个数都填充成相同的位数nums[i] = (nums[i] + '').padStart(maxDigits, 0);// 先根据个位数把每一个数放到相应的桶里let temp = nums[i][nums[i].length-1];arr[temp].push(nums[i]);}// 循环判断每个位数for(let i=maxDigits-2; i>=0; i--) {// 循环每一个桶for(let j=0; j<=9; j++) {let temp = arr[j]let len = temp.length;// 根据当前的位数i把桶里的数放到相应的桶里while(len--) {let str = temp[0];temp.shift();arr[str[i]].push(str);}}}// 修改回原数组let res = [].concat.apply([], arr);nums.forEach((val, index) => {nums[index] = +res[index];}) 
}

计数排序

以数组元素值为键,出现次数为值存进一个临时数组,最后再遍历这个临时数组还原回原数组。因为 JavaScript 的数组下标是以字符串形式存储的,所以计数排序可以用来排列负数,但不可以排列小数。

最好:O(n + k),k是最大值和最小值的差。
最坏:O(n + k)
平均:O(n + k)

计数排序动图演示:
在这里插入图片描述

代码演示:

function countingSort(nums) {let arr = [];let max = Math.max(...nums);let min = Math.min(...nums);// 装桶for(let i=0, len=nums.length; i<len; i++) {let temp = nums[i];arr[temp] = arr[temp] + 1 || 1;}let index = 0;// 还原原数组for(let i=min; i<=max; i++) {while(arr[i] > 0) {nums[index++] = i;arr[i]--;}}
}

http://chatgpt.dhexx.cn/article/yaP03x0R.shtml

相关文章

常用排序算法(js)

复习排序算法 时间复杂度、空间复杂度、稳定新 排序算法时间复杂度空间复杂度稳定性冒泡O(n^2)O(1)是选择O(n^2)O(1)不是插入O(n^2)O(1)是希尔O(nlogn)O(1)不是快速O(nlogn)O(nlogn)不是 1. 冒泡排序 思路&#xff1a;每一轮都对相邻的两个元素进行比较&#xff0c;如果逆序…

JS实现快速排序算法

快速排序的基本思想是选择数组中的一个元素作为关键字&#xff0c;通过一趟排序&#xff0c;把待排序的数组分成两个部分&#xff0c;其中左边的部分比所有关键字小&#xff0c;右边的部分比所有关键字大。然后再分别对左右两边的数据作此重复操作&#xff0c;直到所有元素都有…

JavaScript排序算法专栏(JS十大排序算法详解)

一、冒泡排序 1、Explanation And Steps&#xff08;解释的步骤&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的…

JS实现经典的排序算法

几大经典排序算法实现&#xff1a; 1.排序算法介绍&#xff1a; 2.基本算法 2.1 冒泡排序 function bubbleSort(arr) {var len arr.lengthfor (var i 0; i < len; i) {for (var j 0; j < len - 1 - i; j) {if (arr[j] > arr[j 1]) {;[arr[j], arr[j 1]] [arr…

js实现常见排序算法

文章目录 前言一、排序相关概念1.比较排序和非比较排序比较排序非比较排序 2.稳定性和不稳定性 二、各排序算法对比三、排序算法中的通用函数以及对数器1.通用函数交换函数取两索引的中间下标&#xff0c;中间值mid 2.对数器 四、各排序算法的实现1.冒泡排序算法思想过程图解代…

js-常见排序算法

目录 一、选择排序 二、冒泡排序 三、插入排序 1. 希尔排序 四、归并排序 五、快速排序 版权声明&#xff1a;本文为博主原创文章&#xff0c;若文章中有错误请联系博主改正&#xff0c;请不要恶意留言(不喜欢请绕道)。欢迎大家转载&#xff0c;转载时请注明原文地址:https://b…

3.JS排序算法之选择排序

选择排序&#xff08;selectSort&#xff09;&#xff0c;顾名思义&#xff0c;每次选择最值进行排序 目录 一、选择排序算法原理 二、选择排序算法分析 三、选择排序算法应用实例 四、选择排序的适用场景 一、选择排序算法原理 1.思路 选择排序的实现思路是从未排序序列中…

JavaScript实现十大排序算法(图文详解)

冒泡排序 排序的效果图 解法 当前解法为升序 冒泡排序的特点&#xff0c;是一个个数进行处理。第i个数&#xff0c;需要与后续的len-i-1个数进行逐个比较。 为什么是 len-i-1个数&#xff1f; 因为数组末尾的i个数&#xff0c;已经是排好序的&#xff0c;确认位置不变的了。…

JS 常见的排序算法

工作中算法不常用&#xff0c;但是排序经常用。因此在这里整理了几种JS中常见的排序算法。 冒泡排序 1、算法思想&#xff1a;判断两个相邻元素&#xff0c;大于则交换位置 2、算法步骤 从数组中第一个数开始&#xff0c;依次与下一个数比较并次交换比自己小的数&#xff0c…

详细解析十大排序算法(js实现)

详细解析十大排序算法js实现 算法概述1.冒泡排序1.1算法描述1.2动图演示1.3代码实现 2.选择排序2.1算法描述2.2动图演示2.3代码实现2.4算法分析 3.插入排序3.1算法描述3.2动图演示3.3代码实现3.4算法分析 4.希尔排序4.1算法描述4.2动图演示4.3代码实现4.4算法分析 5.归并排序5.…

Excel中使用SUMIFS公式时计算结果不正确(原因:有超过15位数字的长编码)

在使用SUMIFS公式进行多条件求和时发现求和结果部分正确&#xff0c;部分错误。 常见原因&#xff1a; 1、公式错误 2、数据格式有问题或者有空格等 仔细检查后发现并不是上述两个原因&#xff0c;而是求和的公式中涉及到超过15位数字的长编码。常见的SUMIF、SUMIFS、COUNTIF等…

mybatis-plus使用

1 mybaitsplus简介 &#xff08;1&#xff09;对于mybatis功能的增强&#xff0c;具体的体现就是对于单表的操作都生成好了&#xff0c;分页&#xff0c;条件查询使用很方便&#xff0c;例如查询操作&#xff0c;直接使用wrapper的实现类&#xff0c;调用方法进行条件的增加&a…

四、Hibernate框架的API (三)-- Session对象

一、Session对象 1.Hibernate最重要的对象,只用使用hibernate与数据库操作&#xff0c;都用到这个对象2.该对象维护了一个Connection对象。代表了与数据库连接的会话。3.该对象实质上是对Connection对象的包装&#xff0c;在Connection对象基础之上&#xff0c;封装了一些方法。…

Criteria的用法

一、Hibernate提供了5种检索对象的方式 1.导航对象图检索方式&#xff1a;根据已经加载的对象导航到其他对象    from Emp e group by e.dept.deptName 2.OID检索方式&#xff1a;按照对象的OID来检索对象   get/load 3.HQL检索方式&#xff1a;使用面向对象的HQL查询语…

第13章:处理Excel电子表格(笔记)

13.1&#xff1a;Excel文档 13.2&#xff1a;安装openpyxl模块 pip install --user --Uopenpuxl2.6.2 这是安装2.6.2版本的&#xff0c;比较新的版本与学习的书籍的信息有一点不兼容 13.3&#xff1a;读取Excel文档 13.3.1&#xff1a;用openpyxl模块打开Excel文档 import …

关于 range.autofilter 和 VBA的 filter

1 range().autofilter容易出错的地方 1.1 range().autofilter的返回值 range().autofilter 返回值总是 true返回值并不是对象&#xff0c;而是执行一个筛选的操作所以 Sub test1_filter5() Dim rng1 As Range Set rng1 Range("b1:b20").AutoFilter(field:1, Crit…

Opencv学习之角点检测

Opencv学习之角点检测 角点检测 在图像处理和计算机视觉领域&#xff0c;兴趣点&#xff08;interest points&#xff09;&#xff0c;也被称作关键点&#xff08;key points&#xff09;、特征点&#xff08;feture points&#xff09;。它被大量用于解决物体识别、图像识别…

VBA-Range.AutoFilter 方法浅析

VBA-Range.AutoFilter 方法的一些“坑” 学到筛选的时候遇到一些小小的“坑”&#xff0c;记录下。 录制出来的宏是这样的&#xff0c; Sub 宏1()宏1 宏Rows("1:1").SelectSelection.AutoFilterActiveSheet.Range("$A$1:$F$1048").AutoFilter field:4, …

Hibernate查询Query By Criterial

提供的检索方式&#xff1a;&#xff08;1&#xff09;导航对象图检索方式 &#xff08;2&#xff09;OID检索方式&#xff08;3&#xff09;HQL检索方式&#xff08;4&#xff09;QBC检索方式[query by Criteria(标准)]&#xff08;5&#xff09;本地SQL检索方式 1、简介 1.…

SLUB和SLAB的区别

转载&#xff1a;http://www.cnblogs.com/tolimit/ 首先为什么要说slub分配器&#xff0c;内核里小内存分配一共有三种&#xff0c;SLAB/SLUB/SLOB&#xff0c;slub分配器是slab分配器的进化版&#xff0c;而slob是一种精简的小内存分配算法&#xff0c;主要用于嵌入式系统。慢…