一 基本思想
- 通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序的目的。
二 例子
class QuickSort
{
public static void Sort(int[] array)
{
QSort(array, 0, array.Length - 1);
}
private static void QSort(int[] array, int low, int high)
{
int middle;
if (low < high)
{
middle = Partiton(array, low, high);
QSort(array, low, middle);
QSort(array, middle + 1, high);
}
}
private static int Partiton(int[] array, int low, int high)
{
int temp = array[low];
while (low < high)
{
while (low < high && array[high] >= temp)
{
high--;
}
array[low] = array[high];
while (low < high && array[low] <= temp)
{
low++;
}
array[high] = array[low];
}
array[low] = temp;
return low;
}
}
三 复杂度分析
- 最优的情况(每次都是对半分),时间复杂度是 O(nlog₂n)。
- 最坏的情况,数据是正序或者逆序, 每次划分只得到一个比上一次划分少一个记录的子序列,另一个为空, 所以需要划分 n - 1 次, 而且 第 i 次划分 需要经过 n - i 次比较才能找到第 i 个记录, 因此比较次数为 (n-1) + (n-2)+ ``````+ 1 = n(n-1)/2.。也就是时间复杂度为O(n²)。
- 平均情况下, 时间复杂度为O(nlog₂n)。
- 空间复杂度,主要是递归造成的栈空间的使用, 最好情况,递归树的深度是log₂n, 空间复杂度O(log₂n), 最坏情况, 需要进行n-1次递归, 空间复杂度是O(n)。平均情况是O(log₂n)。