七種排序--------快速排序(Quick Sort)

快速排序的思想是通過一趟排序將待排記錄分割成獨立的兩部分,其中一部分記錄的關鍵字比另一部分記錄的關鍵字小,則可分別對這兩部分記錄繼續進行排序,以達到整個序列有序的目的。

直接看代碼:

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)

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