生活不菜,菜鳥不菜。大家好,又和大家見面了,最近看了一下快速排序,首先說一下,快速排序的思想。
快速排序的思想是這樣子的:它是運用了分而治之的思想,把一個問題分開成幾個小部分分別解決,然後重組。在快速排序中,n個元素被分爲三段:左段left,右段right和中段middle。中段僅包含一個元素。左段中的各個元素都小於中段的元素,右段的各元素都大於中段元素。因此left和right中的元素可以獨立排序,並且不必對left和right的排序結果進行合併(左段排好+中段+右段排好=有順序的數組,不用再合併重組)。middle中的元素被稱爲支點(pivot)。
下面首先給大家看一下快速排序的僞代碼。
//使用快速排序方法對a[0:n-1]排序
從a[0:n-1]中選擇一個元素作爲middle,該元素爲支點。
把餘下的元素分割爲兩段作爲left和right,使得left中的元素都小於等於支點,而right中的元素都大於等於支點。
遞歸的使用快速排序方法對left進行排序。
遞歸的使用快速排序方法對right進行排序。
所得結果爲left+middle+right
以上就是思想+僞代碼,下面舉一個例子,然後我們一起寫一下代碼。
例如元素序列[4,8,3,7,1,5,6,2]。假設選擇元素6作爲支點,則6位於middle;4,3,1,5,2位於left;8,7位於right;當left排好序後,所得結果爲1,2,3,4,5;當right排好序後結果爲7,8。把right中的元素放在支點元素之後,left中的元素放在支點元素之前,即可得到最終的結果[1,2,3,4,5,6,7,8,]。
下面我們一起寫一下代碼
template<class T>
void QuickSort(T* a,int n)
{//對a[0:n-1]進行快速排序
{//要求a[n]必須有最大關鍵值
quickSort(a,0,n-1);
template<class T>
void quickSort(T a[],int l,int r)
{
if(l<=r) return;//遞歸結束的標誌。
int i=l; //從左到右的遊標。
int j=r+1; //從右往左的遊標。
pivot=a[l]; //設置middle的元素,一般爲將要被排序元素的第一個元素。
//把左側>=pivot的元素與右側<=pivot的元素進行交換
while(true){
do{//在左側尋找>=pivot的元素
i=i+1;
}while(a[i]<pivot);
do{//在右側尋找<=pivot
j=j-1;
}while(a[j]>pivot);
if(i>=j)break;//未發現交換對象
Swap(a[i],a[j]);
}
//設置pivot
a[l]=a[j];
a[j]=pivot;
quickSort(a,l,j-1);//對左段排序
quickSort(a,j+1,r);//對右段排序
}
好了,講到這裏代碼就講完了,大家如果想要弄清楚裏邊的流程和思想,最好找幾個比較簡單的例子,親自跑一下,在紙上畫一畫,就簡單明瞭了~就這樣,謝謝大家。