一、思想
分治。选一个pivot,将比pivot小的元素放在左边,比pivot大的元素放在右边,对左右两个子数组递归调用QuickSort。
二、实现
int partition(int* A, int low, int high)
{
int pivot = A[low];
while (low < high)
{
while (low < high && A[high] >= pivot)
{
high--;
}
A[low] = A[high];
while (low < high && A[low] <= pivot)
{
low++;
}
A[high] = A[low];
}
A[low] = pivot;
return low;
}
void QuickSort(int* A, int low,int high)
{
if (low < high)
{
int pivotPos = partition(A, low, high);
QuickSort(A, low, pivotPos - 1);
QuickSort(A, pivotPos + 1, high);
}
}
三、性能
划分的两个子问题规模分别为0和n时,时间复杂度最坏为O(n^2);
两个子问题规模相同时,时间复杂度最好为O(nlgn),平均性能更接近最好情况。
假设输入数据的所有排列不是等概率的,那么为了避免最坏情况的发生,选择pivot可以随机进行。