JS实现快速排序

作者: Leondt | 来源:发表于2018-06-11 11:16 被阅读69次

看了一篇通俗易懂的快排文章 快排,下面一步一步 实现整个过程。

快排的基本思想

上面链接的文章对快排的思路提出了一个很形象的概念:挖坑填数 + 分治法,分三个步骤实现:

  1. 从数组中取出一个数作为基准(pivot)。
  2. 在原数组中进行移动,将大于基准的数放到基准右边,小于基准的数放到基准左边,在基准左右形成两个子数组。
  3. 在左右子数组中反复执行步骤1、2,直到所有子数组只剩下一个数。

详细步骤

初始数组如下所示,取第一个数为基准,此时:i = 0, j = 9, pivot = arr[0] = 36,此时 i = 0 的位置就挖了一个坑,等待小于36的数来填这个坑。i 先不变,j-- 从后往前找小于基准的数:


i = 0, j = 8 时,24 < 36,将 arr[8] 挖出,放入 arr[0] 的“坑中”(实际上在写程序时,是 arr[8] 与 arr[0] 交换)。接着arr[8] 的坑怎么填?调换顺序从前往后找比基准大的数(i++,j 不变):


i = 3, j = 8 时,43 > 36,将 arr[3] 挖出,放入 arr[8] 的“坑中”。接着去找数填 arr[3] 的坑,调换顺序从后往前找比基准小的数:


i = 3, j = 5 时,20 > 36,反向查找:


i = j = 5 时,退出,第一趟排序完成,以 arr[5] = 36 为界分为左右两个子数组:


接着在左右两个子数组中重复上面的排序过程,直到每个子数组的长度为1,排序结束!下面只给出每一步的执行结果:


JS代码

// 交换元素
function swap(arr, i , j) {
  let temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp; 
}

// 快排
function quickSort(arr, i, j) {
  if(i < j) {
    let left = i;
    let right = j;
    let pivot = arr[left];
    while(i < j) {
      while(arr[j] >= pivot && i < j) {
        j--;
      }
      if(i < j) {
        swap(arr, i , j);
        i++;
      }
      while(arr[i] <= pivot && i < j) {
        i++;
      }
      if(i < j) {
        swap(arr, i , j);
        j--;
      }
    }
    arr[i] = pivot;
    quickSort(arr, left, i-1);
    quickSort(arr, i+1, right);
    return arr;
  }
}
// example
let arr = [2, 10, 4, 1, 0, 9, 5 ,2];
alert(quickSort(arr, 0 , arr.length-1));

相关文章

  • JS实现快速排序

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

  • JS实现快速排序

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

  • 快速排序JS实现

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

  • JS实现快速排序

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

  • JS实现快速排序

  • JS 实现快速排序

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

  • JS实现快速排序算法

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

  • js数组快速排序实现

  • JS实现快速排序算法

    采用了分治的思想(1)在数据集之中,选择一个元素作为"基准"(pivot)。(2)所有小于"基准"的元素,都移到"...

  • 快速排序的JS实现

    From:阮一峰 快速排序(Quicksort)的Javascript实现[https://www.ruanyif...

网友评论

  • bfe1991790f8:讲解很细致 请问博主是用什么软件画的图?
    Leondt:在线作图网站,ProcessOn
  • b30e7f389683:豁然开朗,文章写得还是不错,方便留下联系方式,想深入交流一番

本文标题:JS实现快速排序

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