參考了weiss的《資料結構與演算法分析》的c++描述第三版。
快速排序原理其實很簡單,是乙個遞迴的過程。首先確定乙個樞紐元,然後把大於樞紐元的元素放在左邊,把小於樞紐元的元素放在右邊。然後再對左右兩邊的子串行不斷的重複這個操作(確定樞紐元,然後把大小元素歸類),直到子串行中的元素為0個或1個的時候結束。
需要注意的兩個地方:第乙個是樞紐元的選取。最好不要直接選擇序列的第乙個元素作為樞紐元,因為在待排序列較為有序的時候,可能會一直處於最壞的情形。常見的選取方法是三數取中(詳細的可見下面的程式)。
第二個需要注意的地方是如何處理等於樞紐元的元素。對於從兩邊往中間走的游標i和j來說,如果遇到等於樞紐元的元素,就應該讓i和j停止。
程式如下:
結果如圖(以含有多個相同元素的序列為例)#include#include#include#include#include#includeusing namespace std;
/** 快速排序通過遞迴實現,因此該函式為驅動函式
*/templatevoid quicksort(vector& a)
/** 通過「三數選中」的方法選擇樞紐元
* 找到樞紐元後,放在right-1的位置上
*/templateconst comparable & median3(vector&a, int left, int right)
/* 快速排序主要的函式
a表示待排的向量
left表示子串行的最左邊元素下標
right表示子串行的最右邊元素的下標
*/templatevoid quicksort(vector& a, int left, int right)
swap(a[i], a[right - 1]);//把樞紐元放回在相應的位置
quicksort(a, left, i - 1);//把小於樞紐元的集合排序
quicksort(a, i + 1, right);//把大於樞紐元的集合排序
} else
}/*在快速排序遞迴的時候,如果向量長度小於10就用插入排序
*/templatevoid insertionsort(vector& a, int left, int right)
}/*輸出向量*/
templatevoid printvector(vector& v)
int main()
cout << "排序前:" << endl;
printvector(source);
quicksort(source);
cout << "排序後:" << endl;
printvector(source);
return 0;
}
排序 快速排序,C 實現
本文 的github位址 基本思想 快速排序 是對 氣泡排序 的改進。基本原理 基於分治法,在待排線性表中取乙個元素pivot作為樞軸值,通過一趟排序將待排線性表劃分為獨立的兩部分,第一部分的所有元素小於pivot,第二部分的所有元素大於等於pivot,pivot位於其最終位置。遞迴對兩個子表做快速...
快速排序 c 實現
快速排序思想 基於分治策略,對氣泡排序的一種改進。對於要排序的乙個序列,從中選一值進行排序,將其放入到正確的位置position。然後以position為界,對左右兩部分再做排序。直到劃分的長度為1。步驟 設有一待排序的序列 1.分別設定low hight指向序列的最左端 最右端 從序列中選乙個進行...
快速排序(C 實現)
include using namespace std void swap int a,int b int sort int begin,int end if beginwhile beginif begin return begin void quicksort int begin,int end...