参考:http://www.cnblogs.com/cj723/archive/2011/04/27/2029993.html 《大话数据结构》快速排序
快速排序是最经典效率最高的排序算法,其最优时间复杂度为O(nlogn),平均时间复杂度为O(nlogn),最差情况为O(n2).
其基本思想是首先确定一个枢纽,然后寻找一个恰当的位置,使得枢纽前的序列均小于枢纽,枢纽后的序列大于枢纽。然后使用分治递归的方法处理枢纽两端的子序列,直至子序列长度为0或1。
在此,枢纽的选择是有讲究的,不明智的方法是选择待排序序列的第一个或者最后一个元素作为枢纽,因为这样会在某些情况下(序列进行过预排序或逆序)使算法复杂度大大增加。还有方法就是随机选择枢纽,或者从第一,最后,中间三个元素中选择一个居中的元素,作为枢纽。
算法的代码如下:
void QSort(SqList *L, int low, int high)
{
int pivot;
if(low < high)
{
pivot = Partition(L, low, high);
QSort(L, low, pivot - 1);
QSort(L, pivot + 1, high);
}
}
int Partition(SqList *L, int low, int high)
{
int pivotkey;
pivotkey = L->r[low];
while(low < high)
{
while(low < high && L->r[high] >= pivotkey)
high--;
Swap(L, low, high);
while(low < high && L->r[low] <= pivotkey)
low++;
Swap(L, low, high);
}
return low;
}
void Swap(SqList *L, int low, int high)
{
int temp;
temp = L->r[low];
L->r[low] = L->r[high];
L->r[high] = temp;
}