常見排序算法:快速排序算法

基本思想:先確定一個基數,一般選取數組中第一個。然後從右邊開始向左邊移動j,與基數進行比較,若比基數小則停止移動,並將該數賦值給左邊基數處,然後從左邊向右邊移動i,找到比基數大的數便停止運動。此時將值賦給j處。依次類推。當j=i時停止移動。此時將基數移動到他們相等處。基數左邊和右邊分別重複上述過程。

 

1.首先取出基數。一般取數組首元素。i指向數組頭部,j指向數組尾部。

 2.因爲i處爲空需要填補,因此移動j,找到第一個比基數小的數,此時j=length-1,a[j]=1<temp;滿足條件將1移動到i處。

3.此時j處爲空需要移動i,找到比基數大的數,當i移動到length-1處與j重合,都沒找到比基數大的數,將基數填補進空白處。

4.此時基數已經被填入,基數將待排序數分爲左半部分和右半部分,i已經指向了最後一個元素,因此右半部分不需要重新尋找基數進行排序。對於左半部分,i從0開始,基數取爲1,移動j尋找比i小的數。j此時從j-1處開始移動。

5.當j移動到數組頭部與i重合都沒有找到符合條件的數,將基數填入空白處。此時只存在右半部分需要進行排序。

6.基數從上一輪的i+1處開始,j指針從上一輪的j-1處開始移動即length-2處開始。尋找比5小的數。

 

 7.當j移動到4處比基數小。將4填入空白處,此時j指向空白,移動i尋找比基數大的數,i移動一格便與j重合,因此將基數填入空白處。

8.此時5將數組分爲兩部分。對於左右兩部分分別重複上面的過程即可。

代碼:

/*快速排序:
			左邊爲i,右邊爲j,右邊先移動直到找到比基準(左邊第一個)小的數便停止移動
			此時將右邊賦值給左邊i處,左邊i處向右移動直到比基準大,此時將i處的值賦值給j,將基準值賦值給i處
			*/
void QuickSort(int list[], int left, int right)
{
	int mid, i, j;

	mid = list[left];//基準數,一般取左邊第一個
	i = left;
	j = right;

	if (left >= right)
	{
		return;
	}

	while (i < j)
	{
		//從右向左找比基準數小的位置
		while (i < j && list[j] >= mid)
		{
			--j;
		}
		list[i] = list[j];//將找到的小數移動到基準數的位置處

		//從左向右找比基準數大的位置
		while (i < j && list[i] < mid)
		{
			++i;
		}
		list[j] = list[i];
	}
	list[i] = mid;//基準數放在合適位置
	QuickSort(list, left, i - 1);//左部分快速排序
	QuickSort(list, i + 1, right);//右部分快速排序
}

int main()
{
	int list[] = { 12, 5, 4, 6, 7, 6, 1 };

	QuickSort(list, 0, sizeof(list) / sizeof(int)-1);

	for (int i = 0; i < sizeof(list) / sizeof(int); i++)
	{
		cout << list[i] << endl;
	}
}

快速排序的最壞時間複雜度:O(n^{2}),最好時間複雜度爲O(n\log n),平均時間複雜度爲O(n\log n),平均空間複雜度爲O(\log n)

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