对一个快排函数的分析

585 阅读2分钟

该文章用来记录对快排的理解,方便回忆

  function quickSort(arr, left, right) {//left和right代表所要进行对比区间
    var len = arr.length,
      partitionIndex,
      left = typeof left != 'number' ? 0 : left,
      right = typeof right != 'number' ? len - 1 : right;//设置初始首尾下标

    if (left < right) {//直到
      partitionIndex = partition(arr, left, right);//返回已排序好的基准值准确位置下标
      quickSort(arr, left, partitionIndex - 1);//对已排序好的基准值准确位置下标的左侧进行排序,partitionIndex - 1代表现基准的左侧元素下标
      quickSort(arr, partitionIndex + 1, right);//和上面相反
    }
    return arr;
  }

  function partition(arr, left, right) {     //分区操作
    var pivot = left,                      //设定基准值(pivot)
      index = pivot + 1;
    for (var i = index; i <= right; i++) {
      if (arr[i] < arr[pivot]) {
        swap(arr, i, index);//从已左排序的相邻数开始渐进赋值小于基准值的元素,相当于把所有小于基准值的统统按顺序紧挨着基准值放右边
        index++;//记录符合要求的元素所应该排的位置,当循环完毕后的index意味着基准值所该排的位置
      }
    }
    swap(arr, pivot, index - 1);//最后把一堆小于基准值中的倒数第一的元素与基准值交换,把基准值放到准确位置(固定不再改变),即index-1
    return index - 1;//当前基准值的下标
  }
  function swap(arr, indexA, indexB) {
    [arr[indexA], arr[indexB]] = [arr[indexB], arr[indexA]];
  }
  // test
  const arr = [9,91, 65, 10, 65, 6, 30, 8,7];
  console.log(quickSort(arr));

排序函数来自www.jianshu.com/p/1b4068ccd… ,对其中的快排做分析,原作者的各种排序算法罗列值得一看,并附有生动形象的图片,方便理解

附带另一种写法:

  var quicksort = function (arr) {
    if (arr.length <= 1) {
      return arr;
    }
    var pivotIndex = Math.floor(arr.length / 2);//取一个基准值,用于做参考点(不一定要用这个,像上面,以左侧做基准值)
    var pivot = arr.splice(pivotIndex, 1)[0];
    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]); }
    }
    return quicksort(left).concat([pivot], quicksort(right));//但开了三个线处理,性能上有缺陷
  }