fezaoduke / fe-practice-hard

晚练课
69 stars 6 forks source link

第 91 期(算法-排序):经典排序算法之快速排序 #94

Open wingmeng opened 5 years ago

wingmeng commented 5 years ago

快速排序

快速排序(Quick sort)是一个基于交换的排序算法,它采用分治的策略,所以也称其为分治排序。

quickSort

算法分析:

  1. 从数列中挑出一个元素,称为 “基准”(pivot);
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。
function quickSort(arr, 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);
      quickSort(arr, partitionIndex+1, right);
  }

  return arr;
}

// 分区操作
function partition(arr, left, right) {
  // 设定基准值(pivot)
  var pivot = left, 
      index = pivot + 1;

  for (var i = index; i <= right; i++) {
      if (arr[i] < arr[pivot]) {
          swap(arr, i, index);
          index++;
      }       
  }

  swap(arr, pivot, index - 1);
  return index-1;
}

function swap(arr, i, j) {
  var temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}