1. 程式人生 > >快速排序(效率較高的陣列排序方式)

快速排序(效率較高的陣列排序方式)

實現快速排序的關鍵在於,你從一個數組中取出了一個數字,將他和陣列中所有的數字相比較,比他小的放在陣列的最左邊,比他大的放在最右邊,這個數字將陣列分成比他大和比他小的倆部分,同樣的道理,被分成的倆個子陣列,又可以隨機找出一個數字尋找比他大和小的,一個到最後子陣列沒辦法再被分成倆個部分,利用這樣的二分思想,我們便實現了陣列的快速排序。(本程式碼交換函式與隨機取值函式並未給出,希望讀者自己完成)

int Partition(data[], len, start, end)
{
	int index = 0;
	int small = 0;//定義一個變數,大家可以理解為這是一個標記data[small]的左邊都比他小,右邊都比他大
	if((data == NULL) && len < 0)
		return ;
	index = Randomrange(start, end);//取出start,end之間的一個隨機數字
	Swap(&data[index], &data[end]);

	small = start -1;//從-1開始為了不讓他直接跳過第一個元素,假如取出的數字都比
	陣列中的小那麼結束是的small++讓small變成0,最小的數字就是data[0]
	for(index = start; index < end; index++)
	{
		if(data[index] < data[end])
		{
			small++;
		}
		if(index != samll)//假如取出的數字為7,那麼如果排序4,9,6這樣的幾個數small標記在4的下標
		,遇到9時small不++,到6時又++,這樣就會呼叫這個if語句來交換
		{
			Swap(&data[small], &data[index]);
		}
	}
	small++;
	Swap(&data[small], &data[end]);//排序比較結束後把隨機數換回small+1的位置

	return small;

}
void Quicksort(data[] ,len ,start ,end)
{
	int index = 0;
	if(start == end)
	{
		return ;
	}
	index = Partition(data, len, start, end);//呼叫排序函式返回標記數的位置
	if(index > start)
		Quicksort(data ,len ,start ,index - 1);//不斷應用二分的思想來進行陣列的排序
	if(index < end)
		Quicksort(data ,len ,index + 1 ,end);
}