使用C 實現快速排序QuickSort

2021-07-26 05:11:02 字數 1421 閱讀 5707

參考了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...