温故之 “快速排序”

快速排序是对冒泡排序的一种改进,第一趟排序时将数据分成两部分,一部分比另一部分的所有数据都要小。然后递归调用,在两边都实行快速排序。

快速排序的思想

  1. 在数据集之中,选择一个元素作为"基准"(pivot)。
  2. 所有小于"基准"的元素,都移到"基准"的左边;所有大于"基准"的元素,都移到"基准"的右边。
  3. 对"基准"左边和右边的两个子集,不断重复第一步和第二步,直到所有子集只剩下一个元素为止。

举例来说

现在有一个数据集{85, 24, 63, 45, 17, 31, 96, 50}

  1. 第一步,选择中间的元素45作为"基准"。(基准值可以任意选择,但是选择中间的值比较容易理解。)
    image
  2. 第二步,按照顺序,将每个元素与"基准"进行比较,形成两个子集,一个"小于45",另一个"大于等于45"。
    image
  3. 第三步,对两个子集不断重复第一步和第二步,直到所有子集只剩下一个元素为止。
  function quickSort(arr){
      if (arr.length <= 1){ return arr; } //如果数组<=1,则直接结束递归
      // 定义基准,并把基准从原数组删除
      var pivotIndex = Math.floor(arr.length / 2);
      var pivot=arr.splice(pivotIndex,1)[0];
      // 定义左右数组
      var left = [];
      var right = [];
      // 比基准小的放在left,比基准大的放在right
      for(var i=0; i < arr.length; i++){
          if(arr[i] <= pivot){
              left.push(arr[i]);
          }
          else{
              right.push(arr[i]);
          }
      }
      //递归,对左右两个数组不停的按照基准比较,知道子集都剩下一个为止
      return quickSort(left).concat([pivot],quickSort(right));
  }
posted @ 2019-04-08 17:20  whkl梅  阅读(138)  评论(0编辑  收藏  举报