[数据结构学习笔记21] 快速排序(Quicksort)

快速排序(Quicksort)真的很快,因为它用了分而治之的思想。

基本思想:

1. 选一个中间点的值作为中心点(pivot)

2. 以中心点为基准

  2.1 小于中心点的值,放中心点左边

  2.2 大于中心点的值,放中心点右边

3. 对左右数列,重复1,2,最终会得到排好序的数列。

 

数列举例

4,10,7,3,5,12,40,1,33

中间的数取5(pivot)

第一轮排序

1,4,3,5,12,40,33,10,7 

第二轮排5左右两边的数列

1,4,3,5,12,40,33,10,7 

1,3,4,5,12,10,7,33,40 

第三轮

1,345,12,10,7,3340 

1,345,7,10,12,3340 

 

代码实现(javascript)

function quickSortHelper(arrayInput, left, right) {
  let i = left;
  let j = right;
  let pivotPoint = arrayInput[Math.round((left + right) / 2)];

  // loop
  while (i <= j) {
     while (arrayInput[i] < pivotPoint) {
        i++;
     }
     while (arrayInput[j] > pivotPoint) {
         j--;
     }

     if (i <= j) {
         let tempStore = arrayInput[i];
         arrayInput[i] = arrayInput[j]'
         i++;
         arrayInput[j] = tempStore;
         j--;
      }
  }

  if (left < j) {
        quickSortHelper(arrayInput, left, j);
   }
  if (i < right) {
        quickSortHelper(arrayInput, i, right);
   }

   return arrayInput;
}

function quickSort(input) {
  return quickSortHelper(input, 0, input.length - 1);  
}

调用

let myData = [24, 10, 17, 9, 5, 9, 1, 23, 300];
quickSort(myData);

 

性能分析

场景 时间复杂度 空间复杂度
最好 O(n log n) O(log n)
最坏 O(n^2) O(1)
平均 O(n log n) O(log n)

 

最好情况:中间点选择正好把数列平均分开,每次基本上都是一半对一半,这样有log(n)次递归,每次递归要遍历n个元素,所以复杂度为O(n log n)。

平均情况:和最好情况类似。

最坏情况:每次pivot选择的都是最大或者最小,导致分区极不均衡,这种情况下为O(n^2)。

快速排序不是稳定排序。这意味着,相同值的元素的位置在排序过程中可能会变化。

posted @ 2025-02-07 22:46  Eagle6970  阅读(32)  评论(0)    收藏  举报