js排序算法详解-快速排序

article/2025/11/9 13:32:01

全栈工程师开发手册 (作者:栾鹏)

js系列教程5-数据结构和算法全解

js排序算法详解-快速排序

既然是快速排序,那顾名思义一定很快,快的连小编都被懵逼了好几圈!建议先不要看动图,先看第一种写法:

6.1 抽象版快速排序

function quickSort(array, left, right) {console.time('1.快速排序耗时');if (left < right) {var x = array[right], i = left - 1, temp;for (var j = left; j <= right; j++) {if (array[j] <= x) {i++;temp = array[i];array[i] = array[j];array[j] = temp;}}console.log(array) ;console.log(left,i) ;quickSort(array, left, i - 1);console.log(array)console.log(i,right)quickSort(array, i + 1, right);}console.timeEnd('1.快速排序耗时');console.log(array)return array;
}
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort(arr,0,arr.length-1));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50];

看完代码一脸懵逼,这是人写的么?瞬间觉得自己弱爆了,连别人代码都看不懂,更别说自己写了,别着急,一点点拆分看。

先看一个疑问点,函数中的参数有三个,第一个数组,没得说;第二个是左值,第三个是右值;好,到这里先分析结束,首先给读者一种什么感觉,就是这个排序算法是从左右两端依次逼近完成排序的,那么对于这个猜想对不对呢?

接着看,if条件语句中判断left < right,这没得说,就是从左到右排序的,而且if 如果不成立直接结束本层循环了,那如果满足条件呢,直接进入for循环,而且在进入for循环之前先记录了一个本次循环的末尾值,又设置一个i ,还有一个空变量,都分别又是什么意思呢?

接着看,for循环遍历本层循环,然后依次和末尾值进行比较,那么可想而知,这个变量x无非就是个基数,好了,算法的亮点来了,就是 i 值,如果本层循环某个元素大于本层循环的基数,那么置换两者的位置,那么 i 的作用就是计数的作用,而 temp 就是作为交换暂时存储的介质,然后这样下来就是把每次本层循环的最大值放到了最后,这样下来在quickSort(array, left, i - 1);不断递归循环之后,该数组的右边最小值大于左边的最大值(这里的左边和右边不一定等分),而且左边的顺序已经排好了,然后同理排右边的部分,这样下来函数结束之后就完成了排序。(暂时小编能理解的大概就是这种程度了,不当之处,还望博友指点一二)

6.2 形象版快速排序

var quickSort2 = function(arr) {console.time('2.快速排序耗时');if (arr.length <= 1) { return arr; }var pivotIndex = Math.floor(arr.length / 2);var pivot = arr.splice(pivotIndex, 1)[0];console.log(pivot)var left = [];var right = [];for (var i = 0; i < arr.length; i++){if (arr[i] < pivot) {left.push(arr[i]);} else {right.push(arr[i]);}}console.timeEnd('2.快速排序耗时');return quickSort2(left).concat([pivot], quickSort2(right));
};
var arr=[3,44,38,5,47,15,36,26,27,2,46,4,19,50,48];
console.log(quickSort2(arr));//[2, 3, 4, 5, 15, 19, 26, 27, 36, 38, 44, 46, 47, 48, 50];

看完第一种写法之后,有种放弃的念头,不要着急,慢慢拨开迷雾你能感受到快速排序的奇特之处。

废话不多说直接看代码,第二种开始还能理解,哦,原来和第一种写法类似,第二种则是选择中中间数作为基数进行比较,然后再遍历比较,把比中间值小的放在left数组,把比中间值大的放在right数组中,这种写法再简单不过了,而看到后面return quickSort2(left).concat([pivot], quickSort2(right)); 这是什么鬼?是不是写错了,怎么感觉那么不对劲呢?不要怀疑经典,拆分代码看,哦,原来是不断把数组细分化,分到数组长度为1的最小单位,然后再把左右两个数组拼凑起来,试想每层基循环都有左右两个长度为1的数组,且左数组元素比右数组元素值小,而基循环的基数又是两基数组元素的中间数,那这不就比较完了吗,把三者拼凑起来不正是排序后的序列么,使用递归依次类推形成最后的数组。就是这么简单,完毕。

配上一个动图,第一次看可能会很懵逼,配合代码多看几遍或许能明白其巧妙之处。

这里写图片描述


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

相关文章

JS排序算法(升序)

视频课地址&#xff1a;https://www.bilibili.com/video/BV1yK4y1u7BU/?spm_id_from333.788.video.desc.click&vd_sourceb57e6f6cee98af762f85f7a2cceb0a75 感谢大佬无私分享&#xff01; 选择排序 找出数组中最小项&#xff0c;与当前项交换位置 function selectSort(ar…

1.JS排序算法之冒泡排序

冒泡排序&#xff08;Bubble Sort&#xff09;&#xff0c;顾名思义类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来。通过交换元素位置&#xff0c;达到排序目的&#xff0c;是一种交换排序。 目录 一、冒泡算法原理 二、冒泡算法分析 三、冒泡算法应用实例 四、冒泡排…

js之排序算法简洁

1、冒泡排序 1.1从右往左两两比较&#xff0c;把每轮的最小值放在了arr[i]. 双重for循环 外层循环&#xff1a;定位。 内层&#xff1a;比较交换。 最好时间复杂度&#xff1a;O&#xff08;n&#xff09; 最差时间复杂度&#xff1a;O&#xff08;n^2&#xff09; 平均时间复杂…

JavaScript算法-排序算法

​ 此生之路&#xff0c;我将走过&#xff1b;走过这一次&#xff0c;便再也无法重来。所有力所能及的善行&#xff0c;所有充盈于心的善意&#xff0c;我将毫不吝惜&#xff0c;即刻倾予。我将再不拖延&#xff0c;再不淡漠&#xff0c;只因此生之路&#xff0c;再也无法重来。…

一个简单的js快速排序算法

简介&#xff1a; 快速排序是对冒泡排序的一种改进。它的基本思想是&#xff1a; 通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排…

js排序算法详解-插入排序

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; js系列教程5-数据结构和算法全解 js排序算法详解-插入排序 插入排序的原理其实很好理解&#xff0c;可以类比选择排序。选择排序时在两个空间进行&#xff0c;等于说每次从旧的空间选出最值放到新的空间&am…

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

文章目录 排序算法总结JS 十大排序算法冒泡排序单向冒泡双向冒泡选择排序插入排序快速排序归并排序桶排序基数排序计数排序 排序算法总结 JS 十大排序算法 冒泡排序 作为最简单的排序算法之一&#xff0c;冒泡排序感觉就像Abandon在单词书里出现的感觉一样&#xff0c;每次都…

常用排序算法(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;封装了一些方法。…