快速排序演算法 C語言實現
阿新 • • 發佈:2019-02-18
快速排序演算法(QuickSort)
1.演算法思想
快速排序是一種劃分交換排序,採用了分治策略,通常稱為分治法。
(1)分治法的基本思想
將原問題分解成若干個規模更小但結構與原問題相似的子問題;遞迴地解這些子問題,然後將這些子問題的解組合成原問題的解。
(2)快速排序的基本思想
設當前待排序的無序區為R[low..high],利用分治法可將快速排序的基本思想描述為:
①分解:
在R[low..high]中任選一個記錄作為基準(Pivot),以此基準將當前無序區劃分為左、右兩個較小的子
區間R[low..pivotpos-1)和R[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄
(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄
pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。
注意:劃分的關鍵是要求出基準記錄所在的位置pivotpos。
劃分的結果可以簡單地表示為(注意pivot=R[pivotpos]):
R[low..pivotpos-1].keys≤R[pivotpos].key≤R[pivotpos+1..high].keys
其中low≤pivotpos≤high。
②求解:通過遞迴呼叫快速排序對左、右子區間R[low..pivotpos-1]和R[pivotpos+1..high]快速排序。
③組合:因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步
驟無須做什麼,可看作是空操作。
第一步:找到一個基準數;把小於這個數的數都放到左邊,把大於這個數的數都放到右邊;
第二部:對基準數左邊和右邊的數,重複第一步;
2.快速排序演算法的C語言實現 (1)選取第一個元素作為基準(樞紐元)/**********快速排序演算法*****************/ void QuickSort(char s[],int low,int high) { int i; int last; //記錄基準的位置 if(low<high) //當陣列中的元素個數大於1時,才進行操作 { last=low; //選取第一個元素作為基準 //把小於基準元與大於基準元的分開,last記錄它們分開的界限 for(i=low+1;i<=high;i++) { if(s[i]<s[low]) swap(s,++last,i); } swap(s,last,low);//基準元與界限交換,這樣的話,基準元兩邊就是一邊大於,一邊小於; QuickSort(s,low,last-1); //對左區間遞迴排序 QuickSort(s,last+1,high);//對右區間遞迴排序 } } /*交換陣列中的兩個元素*/ void swap(char s[],int i,int j) { int temp; temp=s[i]; s[i]=s[j]; s[j]=temp; }
注意:
為排序整個檔案,只須呼叫QuickSort(R,0,n-1)即可完成對R[0..n-1]的排序。
(2) 選取第一個元素作為樞紐元,如果輸入是隨機的,那麼這是可以接受的,但是如果輸入是預排序的或是反序的,那麼選取第一個元素作為樞紐元就產生一個劣質的分割,因為所有的元素不是被劃到這一邊就是劃到另一邊。 隨機選取樞紐元是一種安全的做法; 三數中值分割法:使用陣列的左端、右端和中心位置上的三個元素的中值作為樞紐元