快速排序的思想是通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。
直接看代碼:
void QuickSort(Sqlist *L)
{
QSort(L,1,L->length);
}
因爲用到遞歸,所以把函數封裝了了一下。
來看QSort()函數:
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); //對高子表遞歸排序
}
}
Partition()函數要做的就是在序列中選區一個關鍵字,經過函數運行之後讓他的左邊的數都比他小,右邊的數都比他大。
來看Partition()函數:
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; //返回樞軸所在的位置
}
複雜度分析:
時間複雜度:O(nlogn)
空間複雜度:O(logn)