快速排序
快速排序:快速排序(Quicksort)是对冒泡排序算法的一种改进。
- 选择A中的任意一个元素pivot,该元素作为基准
- 将小于基准的元素移到左边,大于基准的元素移到右边(分区操作)
- A被pivot分为两部分,继续对剩下的两部分做同样的处理
- 直到所有子集元素不再需要进行上述步骤
-
void QuickSort(R[], int lo, int hi) { 将lo, hi用i, j两个副本进行拷贝(** 声明基准; if(划分长度大于等于2,即hi > lo) { 取基准为左端端点;//都可 当hi 不等于 lo时循环; 当hi > lo且R[hi] > temp时循环; hi--(继续往中间靠; R[lo] = R[hi];//发现小于基准的替换将其替换到左半区 当lo < hi且R[lo] < temp时循环; lo++(继续往中间靠; R[hi] = R[lo];//发现大于基准的将其替换到右半区 在hi,lo重合处放基准;//数据平衡,循环里有一个数据是直接被覆盖的,就是基准,现在将其添加回数组中 QuickSort(R[], lo, i - 1); QuickSort(R[], i + 1, hi);//递归继续进行快排 //要是前面没有进行副本拷贝在这里进行递归操作时就不太好判断边界了。 } }
算法分析:
- 最差情况:
最差情况是,每次我们在划分时,所取的基准总是数组中最小的,因此我们总共会进行
次划分,且在第
次划分时,区间长度为:
,需要进行
比较。
故:
- 最好情况:
最好的情况是,每次所取的基准就是该数组的中点,因此一共需要进行n次划分,对于 长度为
的划分空间,需要进行
次比较。剩下的两个无序子区间需要进行
的比较次数。设
故:
- 平均情况:
复杂度:
浙公网安备 33010602011771号