美文网首页让前端飞
重学JS(十三)—— js实现快速排序

重学JS(十三)—— js实现快速排序

作者: 闪闪发光的狼 | 来源:发表于2018-07-06 17:41 被阅读19次

快速排序的算法已经忘得干干净净,这次拿出来重温下,并用JS实现一次。

原理

先介绍下大致的排序步骤:
比如有这么一个数组:

0 1 2 3 4
5 7 1 4 3

以第一个值为基准值base=5,左侧的下标left=0,右侧的下标right=4。
(1)从右(right=4)开始找比5小的值,如果不符合就right--。发现3比5小,交换位置后

0 1 2 3 4
3 7 1 4 5

此时left=0,right=4。
(2)从左开始找比5大的值,如果不符合就left++。发现7比5大,交换位置后

0 1 2 3 4
3 5 1 4 7

此时left=1,right=4。到此一轮循环结束
(3)继续从下标right开始,由右向左寻找比5小的值,发现4比5小,交换位置后

0 1 2 3 4
3 4 1 5 7

此时left=1,right=3。
(4)继续从下标left开始,由左向右寻找比5大的值,直到left=right,也没有找到

0 1 2 3 4
3 4 1 5 7

此时left=3,right=3。到现在第一步就完成,基准值的左边都比它小,右边都比它大。然后分别对左右两侧的数组进行同样的操作即可。

实现

function quickSort(arr){
  let tmpArr = [...arr];  //复制数组
  return quick(tmpArr,0,tmpArr.length-1);
}
function quick(arr,i,j){
  if(j - i <= 0) return;  //说明数组只有一个值了
  let left = i,right = j;
  let base = left;  //以左边第一个为基准值
  let center = arr[base];
  while(left < right){  //开始循环了
     //每次循环包括从右往左和从左往右
    while(left < right && center < arr[right]){
      right--;
    }
    if(left < right){  //找到了,交换位置
      arr[base] = arr[right];
      arr[right] = center;
      base = right;
      left++;
    }
    while(left < right && center > arr[left]){ //找到了,交换位置
     left++; 
    }
    if(left < right){
      arr[base]  = arr[left];
      arr[left] = center;
      base = left;
      right--;
    }
  }
  quick(arr,i,base-1); //分别处理左右两侧了
  quick(arr,base+1,j);
  return arr;
}

完成了。
测试一波

quickSort([1,4,5,2,55,88,33,22]);  //[1, 2, 4, 5, 22, 33, 55, 88]
quickSort([3,1,2,31,11,66,33,1]);  // [1, 1, 2, 3, 11, 31, 33, 66]
quickSort([3,3,3,2,2,2,1,1,1]);  //[1, 1, 1, 2, 2, 2, 3, 3, 3]

好了,如果有问题还望指出。

相关文章

  • 重学JS(十三)—— js实现快速排序

    快速排序的算法已经忘得干干净净,这次拿出来重温下,并用JS实现一次。 原理 先介绍下大致的排序步骤:比如有这么一个...

  • JS实现插入排序、快排、二分查找法

    用JS实现插入排序 用JS实现快排 用JS实现二分查找法

  • JS实现快速排序

    大致分三步: 1、找基准(一般是以中间项为基准) 2、遍历数组,小于基准的放在left,大于基准的放在right ...

  • JS实现快速排序

    看了一篇通俗易懂的快排文章 快排,下面一步一步 实现整个过程。 快排的基本思想 上面链接的文章对快排的思路提出了一...

  • 快速排序JS实现

    快速排序原理 快速排序的基本思想是选取一个基准值将排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分...

  • JS实现快速排序

    快速排序用到以下方法 Math.floor->返回小于或等于一个给定数字的最大整数 splice->向/从数组中添...

  • JS实现快速排序

  • JS 实现快速排序

    快速排序的思想 (1)在数据集之中,找一个基准点 (2)建立两个数组,分别存储左边和右边的数组 (3)利用递归进行...

  • JavaScript中的排序方法

    前言 这是一个纯粹的个人复习与加深对JS的排序认识的日志,我将从实现原生JS的sort方法开始复习,然后实现快速排...

  • JS实现快速排序算法

    快速排序 快速排序 由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割...

网友评论

    本文标题:重学JS(十三)—— js实现快速排序

    本文链接:https://www.haomeiwen.com/subject/ofrbuftx.html