[数据结构学习笔记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 @   Eagle6970  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验
点击右上角即可分享
微信分享提示