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