幾種常見的排序算法及其複雜度——快速排序(二)

快速排序(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、快速排序算法的時間複雜度分析——博客園

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章