javascript高级排序算法之快速排序(快排)

javascript高级排序算法之快速排序(快排)
我们之前讨论了javascript基本排序算法

  • 冒泡排序
  • 选择排序
  • 插入排序

简单复习:

冒泡排序:

  1. 比较相邻的两个元素,如果前一个比后一个大,则交换位置。
  2. 第一轮的时候最后一个元素应该是最大的一个。
  3. 按照步骤一的方法进行相邻两个元素的比较,这个时候由于最后一个元素已经是最大的了,所以最后一个元素不用比较。

选择排序:
首先从原始数组中找到最小的元素,并把该元素放在数组的最前面,然后再从剩下的元素中寻找最小的元素,放在之前最小元素的后面,直到排序完毕。

插入排序:

  1. 从第一个元素开始,该元素可以认为已经被排序;
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置;
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置;
  5. 将新元素插入到该位置后;
  6. 重复步骤2~5。

今天开始讨论高级排序算法

快速排序

快速排序是处理大量数据最快的排序算法之一,一种分而治之的算法,通过递归的方式将数据依次分解为包含较小元素和较大元素的不同子序列,然后不断重复这个步骤直到所有数据都是有序的。
首先需要在数据列表中选择一个元素作为基准值(pivot,这个变量我们后面会用到),数据排序围绕着基准值进行,(基准值可以是任意一个位置的数,不过一般选择中间的数字或者最左边的数字),每一轮结束后,比该基数小的数都位于该基数的左边,比该基数大的数都位于该基数的右边。然后再分别对基数左边和右边的数组进行相同的操作,直到数组中只有一个元素时,返回该数组。
简单说:(从小到大排序)

  1. 选择一个基准元素,将数据列表分成两个子序列;
  2. 对数据列表进行重新排序,将所有小于基准值的元素放在基准值的前面,所有大于基准值的元素放在基准值的后面;
  3. 分别对较小元素的子序列和较大元素的子序列重复步骤1和2。

看一个🌰:

let arr = []

function arrData(num) { for (let i = 0; i < num; i++) { arr[i] = Math.floor(Math.random() * num + 1) } } arrData(10) function qSort(myArr) { if(myArr.length===0){ return[] } let smallArr=[] let bigArr = [] let pivot = myArr[0] for(let i =1;i<myArr.length;i++){ if(myArr[i]<pivot){ smallArr.push(myArr[i]) }else{ bigArr.push(myArr[i]) } } // return qSort(smallArr).concat(pivot,qSort(bigArr)) return [...qSort(smallArr),pivot,...qSort(bigArr)] } console.log(qSort(arr)); //=>[4, 5, 7, 8, 8, 8, 8, 8, 9, 10] 
JavaScript

先解释一下最后的那句return

return qSort(smallArr).concat(pivot,qSort(bigArr)) return [...qSort(smallArr),pivot,...qSort(bigArr)] 
JavaScript

两句是等效的,第二句不过是是用来es6,相信你是懂的。
在qSort方法中的return里调用了qSort方法,哦,很明显,这是一个递归了,好了,递归就必须有个停止的条件,
所以前面的if判断就很有必要了,否则就会报错(递归常见错误)

《javascript高级排序算法之快速排序(快排)》

👆的🌰,基准值取的是第一个元素,我们也可以取中间的那一个,
⚠️做比较的时候,要把基准排除

function qSort(myArr) { if (myArr.length === 0) { return []; } let pivotIndex = Math.floor(myArr.length / 2); //找基准,并把基准从原数组删除 let pivot = myArr.splice(pivotIndex, 1)[0]; //定义左右数组 let left = []; let right = []; //比基准小的放在left,比基准大的放在right for (let i = 0; i < myArr.length; i++) { if (myArr[i] <= pivot) { left.push(myArr[i]); } else { right.push(myArr[i]); } } //递归 return [...qSort(left),pivot,...qSort(right)] } console.log(qSort(arr));//=> [1, 2, 3, 5, 5, 6, 9, 9, 9, 10] 
JavaScript

性能比较

我们上次对三个基本排序做了性能比较,我们在看看高级排序的性能如何呢?
我门依然使用 console.time和console.timeEnd
代码如下

let arr = []

    function arrData(num) { for (let i = 0; i < num; i++) { arr[i] = Math.floor(Math.random() * num + 1) } } arrData(10) function jssort(myArr) { console.time(`${myArr.length}长度冒泡排序耗时`) for (let i = 0; i < myArr.length - 1; i++) { //要循环多少次 for (let j = 0; j < myArr.length - 1; j++) { //要移动几次 if (myArr[j] > myArr[j + 1]) { [myArr[j], myArr[j + 1]] = [myArr[j + 1], myArr[j]] } } } console.timeEnd(`${myArr.length}长度冒泡排序耗时`) return myArr; } function selectSort(myArr) { console.time(`${myArr.length}长度选择排序耗时`) let minIndex, temp; var len = myArr.length; for (let i = 0; i < myArr.length - 1; i++) { minIndex = i; for (let j = i + 1; j < myArr.length; j++) { if (myArr[j] < myArr[minIndex]) { minIndex = j; } } [myArr[i], myArr[minIndex]] = [myArr[minIndex], myArr[i]] } console.timeEnd(`${myArr.length}长度选择排序耗时`) return myArr; } function insertSort(myArr) { console.time(`${myArr.length}长度插入排序耗时`
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值