經典排序算法之快速排序

快速排序的基本思想是,從帶排序的序列中選取一個關鍵字作爲基數,然後經過一輪排序,將比基數大的關鍵字放置在左側,將比基數小的關鍵字放置在右側。然後再兩側的中間便是此基數的位置,然後再將此基數的兩邊繼續進行快速排序。


從上面可以得知,每一趟快速排序都能夠確定一個關鍵字的位置。


對於每一趟的關鍵字與基數的比較以及移位,我們的方法如下:




最後當low和high重合的時候停止移動比較,此匯合點就是基數2的插入位置了,然後再將左側的{1}和右側的{6, 4, 5}分別進行這個過程。


關於基數的選擇,不一定非得選擇第一個關鍵字,這裏選擇第一個關鍵字,是爲了好插入,即,第一個關鍵字爲基數,保存此基數,然後low當前指向的位置就是空的了,然後從hign開始向前移動直到找到與基數小的關鍵字,則此關鍵字就可以直接存儲在當前low的位置,然後low編程移動比較指針,而此時hign的位置又空了,可以作爲下次比較時比基數大的關鍵字的存儲位置了。假設我們不選擇第一個關鍵字爲基數,而是選擇中間或者其它,照樣可以將序列往後基數的位置移動一下,讓首個關鍵字位置爲空。主要是爲了編程的時候好處理且節約空間。具體代碼如下:


/*對於一個序列,確定一個基數的位置*/
int MakeOne(int *array, int low, int high)
{
	int temp = array[low];
	int active = 1;  //標註活動指針,0爲low,1爲high,初始的時候hign爲活動指針
	while(low != high)
	{
		switch(active)
		{
		case 0:
			if(array[low] <= temp)  //如果low指向的關鍵字比基數還小,則low直接後移
				low++;
			else  //否則,將low指向的關鍵字存放到右側,在將活動指針編程high了
			{
				array[high--] = array[low];
				active = 1;
			}
			break;
		case 1:
			if(array[high] >= temp)
				high--;
			else
			{
				array[low++] = array[high];
				active = 0;
			}
			break;
		}
	}
	if(low == high)
		array[low] = temp;
	return low;
}
/*對於整個序列,進行趟快拍*/
void QuickSort(int *array, int low, int high)
{
	if(low < high)
	{
		int insert = MakeOne(array, low, high);
		QuickSort(array, low, insert-1);
		QuickSort(array, insert+1, high);
	}
}

對於整個序列,合適劃分的時候結束,當序列中只有一個關鍵字的時候,即low已經等於high時就不需要再比較了。只有當low<high的時候纔有必要進行排序。

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