思想:通过一趟排序将待排文件分割成独立的两部分,其中一部分记录的排序码均比另一部分记录的排序码小,然后分别对这两部分进行排序,以达到整个文件有序。一趟快速排序的做法是:设两个变量low和high,它们的初值分别是待排序文件的第一个和最后一个记录的位置,并且取一个记录作为枢轴使用,开始从high所指位置向前搜索直到第一个排序码小于枢轴的记录和枢轴的记录交换,然后从low所指位置向后搜索,找到第一个排序码大于枢轴的记录再和枢轴的记录互相交换,重复交替这两步直到low=high为止。
程序代码:
int Partition(Elem R[],int low,int high)
{
pivotkey = R[0];
R[0] = R[low];
while(low < high)
{
while(low < high && R[high] > R[0])
high--;
R[low] = R[high];
while(low < high && R[low] < R[0])
low++;
R[high] = R[low];
}
R[low] = R[0];
return low;
}
void QSort(Elem R[],int low,int high)
{
if(low < high - 1) //长度大于1
{
pivot_loc = Partition(R,low,high);
QSort(R,low,pivot_loc-1);
QSort(R,pivot_loc+1,high);
}
}
void QuickSort(Elem R[],int n)
{
QSort(R,1,n);
}
平均复杂度:O(nlogn);
最差情况:记录有序,将蜕化为起泡排序,复杂度为O(n2)。为避免这种情况,需在排序之前,进行预处理,即:比较R[low],R[high]和R[(low+high)/2],然后取关键字为三者之中的记录为枢轴记录。
稳定性:不稳定。