快速排序(Quick Sort)
快速排序算法是對冒泡排序的一種改進,冒泡排序一趟比較後只能使排序序列的長度減少1,而快速排序希望經過一趟掃描後使得排序序列的長度大幅度減少。它的基本思想是通過一趟排序將序列劃分爲兩部分,其中一部分所有的數據比另一部分所有的數據都要小。然後對這兩部分分別進行快速排序,整個排序是一個遞歸調用的過程,最終實現整個序列有序。
排序流程:
a) 設置兩個變量,first、last,排序開始的時候first = 0,last = N-1;
b) 以第一個數組元素作爲關鍵數據,賦值給key,即key = A[0];
c)從j開始向前搜索,如果A[j]<key,則A[j]與A[i]互換;否則,j--;
d)從i開始向後搜素,如果A[i]>key,則A[i]與A[j]互換;否則,i++;
e)重複c),d),直至i==j。
示例代碼:
1、qsort函數的用法
qsort函數是編譯器函數庫自帶的函數,原型如下:
void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *));
其中:
base:待排序數組的首地址。
nelem:待排序數組中元素的個數。
width:待排序數組中元素佔用空間的大小。
fcmp:排序函數指針
int cmp(const void* a, const void* b)
{
return (*(int*)a - *(int*)b);
}
……
函數調用:
qsort(orgArray,ARRAY_SIZE, sizeof(orgArray[0]),cmp)
2、自己寫qsort函數
void QuickSortMethod(int arr[], int lowIndex, int highIndex)
{
int key = arr[lowIndex];
int first = lowIndex;
int last = highIndex;
if (first >= last)
{
return;
}
while(first < last)
{
while((first < last) && (arr[last] >= key))
{
last--;
}
arr[first] = arr[last];
while((first < last) && (arr[first] <= key))
{
first++;
}
arr[last] = arr[first];
}
arr[first] = key;
QuickSortMethod(arr, lowIndex, first-1);
QuickSortMethod(arr, first+1, highIndex);
}
算法的時間複雜度:
最壞情況下的時間複雜度:(逆序排列)
如: 8 1 2 3 4 5 6 7
第一趟排序後:7 1 2 3 4 5 6 8,執行了8次比較操作,遊標索引first = last = 7,
第二趟排序的隊列爲:7 1 2 3 4 5 6,需要執行7次比較操作,排序後序列爲:6 1 2 3 4 5 7,遊標索引first = last = 6
……
此時已經退化爲冒泡排序,時間複雜度爲O(n^2)
理想情況下的時間複雜度:
需要對隊列中的每個元素執行一次操作,如果隊列長度爲n,則需要執行n次操作。
將隊列劃分爲兩部分,則需要對每個隊列執行n/2次操作,共n次操作。
再將子隊列分別劃分爲兩部分,則需要對每個隊列執行n/4次操作,4個小隊列,共n次操作。
……
一共可以劃分logn次,所以一共需要執行nlogn次操作。
快速排序算法的時間複雜度用遞歸的方法比較容易計算。現在還沒有完全讀懂,之後來完善。~~~~~~
結論:最壞情況下的時間複雜度O(n^2),平均時間複雜度O(nlogn)
參考資料:
1、 快速排序算法——百度百科
2、qsort函數的用法——博客園
3、快速排序算法的時間複雜度分析——博客園