排序算法之快速排序

原理:

已升序爲例,取一個數爲中位數,比這個數小的放到左邊,比這個數大的放到右邊。

廢話不多說了,我們來看一個快速排序的小視頻吧(http://baidu.ku6.com/watch/8495694393207415318.html?page=videoMultiNeed)。

舉例:

31, 12, 5, 57, 2, 31, 90, 32, 95,76比較31和76,31小於76。
31, 12, 5, 57, 2, 31, 90, 32,95, 76 比較31和95,31小於95。
31, 12, 5, 57, 2, 31, 90,32, 95, 76 比較31和32,31小於32。
31, 12, 5, 57, 2, 31,90, 32, 95, 76 比較31和90,31小於90。
31, 12, 5, 57, 2,31, 90, 32, 95, 76 比較31和31,31等於31。
31, 12, 5, 57,2, 31, 90, 32, 95, 76 比較31和2,31大於2。31和2進行交換。
2, 12, 5, 57, 31, 31, 90, 32, 95, 76 比較12和31,12小於31。
2, 12, 5, 57, 31, 31, 90, 32, 95, 76 比較5和31,5小於31。
2, 12, 5,57, 31, 31, 90, 32, 95, 76比較57和31,57大於31。57與31進行交換。
2, 12, 5,31, 57, 31, 90, 32, 95, 76 此時i==j,31就固定了下來。第一次結束。

31左邊

2, 12,5, 31, 57, 31, 90, 32, 95, 76 比較2和5,2小於5。
2,12, 5, 31, 57, 31, 90, 32, 95, 76 比較2和12,2小於12。
2, 12, 5, 31, 57, 31, 90, 32, 95, 76此時i==j,2固定了下來。第二次結束。

2左邊沒有數據了,看2到31的這塊

2,12, 5, 31, 57, 31, 90, 32, 95, 76比較12和5,12大於5。12和5進行交換。
2,5, 12, 31, 57, 31, 90, 32, 95, 76此時i==j,12固定了下來。第三次結束。

2右邊12左邊這塊
2,5, 12, 31, 57, 31, 90, 32, 95, 76此時i==j,5固定了下來。第四次結束。

看31(左邊的31)的右面

2,5, 12, 31, 57, 31, 90, 32, 95, 76比較57和76,57小於76。
2,5, 12, 31, 57, 31, 90, 32, 95, 76 比較57和95,57小於95。
2,5, 12, 31, 57, 31, 90, 32, 95, 76 比較57和32,57大於32。57和32進行交換。
2,5, 12, 31, 32, 31, 90, 57, 95, 76 比較31和57,31小於57。
2,5, 12, 31, 32, 31, 90, 57, 95, 76 比較90和57,90大於57。90和57進行交換。
2,5, 12, 31, 32, 31, 57, 90, 95, 76 此時i==j,57固定了下來。第五次結束。

看左邊31到57這個塊

2,5, 12, 31, 32, 31, 57, 90, 95, 76 比較32和31,32大於31。32和31進行交換。
2,5, 12, 31, 31, 32, 57, 90, 95, 76 此時i==j,32固定了下來。第六次結束。

左邊31到32這個塊

2,5, 12, 31, 31, 32, 57, 90, 95, 76 此時i==j,31固定了下來。第七次結束。

57右邊這個塊

2,5, 12, 31, 31, 32, 57, 90, 95, 76比較90和76,90大於76。90和76進行交換。
2,5, 12, 31, 31, 32, 57, 76,95, 90比較95和90,95大於90。95和90進行交換。
2,5, 12, 31, 31, 32, 57, 76,90, 95此時i==j,95固定了下來。第八次結束。

57到95這個塊

2,5, 12, 31, 31, 32, 57, 76, 90, 95 比較76和90,76小於90。
2,5, 12, 31, 31, 32, 57, 76, 90, 95 此時i==j,76固定了下來。第九次結束。

76到95這個塊
2,5, 12, 31, 31, 32, 57, 76,90, 95 此時i==j,90固定了下來。第十次結束。

代碼:(優化過後)

void QuickSort(int a[], int low, int high)
{
	if (low < high)
	{
		int left = low, right = high, num = a[low];
		while (left < right)
		{
			while (left < right&&num <= a[right])
			{
				--right;
			}
			if (left < right)
			{
				a[left++] = a[right];
			}
			while (left < right&&a[left] <= num)
			{
				++left;
			}
			if (left < right)
			{
				a[right--] = a[left];
			}
		}
		a[left] = num;
		QuickSort(a, low, left - 1);
		QuickSort(a, left + 1, high);
	}
}


結論:

快速排序是不穩定的排序,受中位數的影響,平均時間複雜度爲O(nlog2n)。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章