排序算法(五)————快速排序

快速排序是一種效率很高的排序算法,也是我們使用最多的一種排序算法。
快速排序原理:
兩個指針分別指向數組兩頭元素,將數組第一個元素保存下來,作爲基準數,兩個指針開始向中間移動,先移動數組尾部指針,直到發現所指元素比基準數小時,將這時候所指向的數賦值給數組頭部指針指向的位置,然後尾部指針停止移動,頭部指針開始移動,直到移動到所指向的元素比基準元素大時,將此時所指向的元素賦值給尾部指針所指向的位置,頭部指針停止移動,尾部指針再次開始移動,如此往復,當兩個指針位置重合時,停止移動,將基準元素的值賦值給此時所指向的位置,第一次移動結束。此時將數組分爲以基準元素左和右兩個數組,分別遞歸進行上面的操作,直到得出最後的有序數列。

例:
有一組數列 3,12,2,14,66 請使用快速排序將他們進行從小到大排序。

解:
3 12 2 14 66
第一趟中我們先把val基準數設置爲3
L指向3,H指向66,先移動H,我們發現移動到2時,2比3小,所以把2賦值給L指向的位置,此時數組變成:
2 12 2 14 66
此時H指向第二個2,L指向第一個2,移動L,到12發現其比基準數3要大,故將12賦值給H的位置,此時數組變爲:
2 12 12 14 66
此時L指向第一個12,H指向第二個12,移動H,發現跟L重合了,所以此時將基準數賦值給此時的位置,數組變爲:
2 3 12 14 66
第一趟結束,我們可以看出此時基準數3左邊都比3要小,右邊都比3要大,排序成功,將3左右拆成兩個新數組:2 和 12 14 66,然後分別重複以上步驟,最後便可得到最終結果。

代碼實現(以下代碼已經過測試,可以直接運行):

#include <stdio.h>

void QuickSort(int* Arr, int low, int high);
int FindPos(int* Arr, int low, int high);

int main()
{
	int Arr[7] = { 13,45,23,45,78,66,99 };
	QuickSort(Arr, 0,6);
	for (int i = 0;i < 7;i++)
	{
		printf_s("%d", Arr[i]);
	}
}

//low爲數組開始元素下標,high爲結束元素下標
void QuickSort(int* Arr,int low,int high)
{
	int pos;
	if (low < high)
	{
		pos = FindPos(Arr, low, high);
		QuickSort(Arr, low, pos - 1);
		QuickSort(Arr, pos + 1, high);
	}
}

//用於找到基準點的排序後所在的位置
int FindPos(int* Arr,int low, int high)
{
	int val = Arr[low];
	while (low<high)
	{
		while (low < high && Arr[high]>=val)
		{
			high--;
		}
		Arr[low] = Arr[high];
		while (low<high && Arr[low]<=val)
		{
			low++;
		}
		Arr[high] = Arr[low];
	}
	Arr[low] = val;
	return low;
}

時間複雜度:O(nlogn) 推導過程涉及到遞歸的時間複雜度求解,以後將更新給出。

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