快速排序(quick sort)

2021-08-26 09:50:24 字數 1561 閱讀 8351

快速排序

如圖顯示該分割槽,它具有以下屬性:s1=thearray[first....poivotindex-1]分割槽的所有項都小於樞軸項p,而s2=thearray[pivotindex+1 .....last]的所有項大於等於p。這個屬性並未說明陣列已經完成排序,但指出乙個重要的事實:在正確排序陣列後,雖然位置first到pivotindex-1的元素的相對位置可能變化,但依然在first到pivotindex-1範圍內。同樣,在正確排序陣列後,雖然位置pivotindex+1 到last的相對位置可能變化,但依然在pivotindex+1 到last範圍內。最終的有序陣列中,樞軸項的位置保持不變。

分割槽列出作為遞迴解決方案組分的陣列項之間的關係。圍繞樞軸項p排列陣列,將產生兩個更小的排序問題:排序陣列的左側部分(s1),排序陣列的右側部分(s2)。樞軸項和陣列項之間的關係指示:一旦解決了左側和右側的陣列排序問題,就解決了原始排序問題。在遞迴呼叫前,分解陣列,可以在正確的位置放置樞軸項,並確保:在排序更小的陣列段後,他們的元素將與陣列其餘部分簡歷適當的關係。另外,快速排序最後將終止:左側和右側的排序問題是更小的陣列排序問題,實際上,因為樞軸項不屬於s1和s2,所以與原始排序問題相比,左側與右側的排序問題跟接近基例;基例是包含乙個元素的陣列。

這個問題的難點之所在圍繞樞軸項劃分陣列部分。因此,設計乙個劃分函式是很必要的。

劃分函式的引數為陣列段thearray[first....last]。該函式必須將陣列段的元素分為兩個區域:小於樞軸項的元素集合s1,大於等於樞軸項的元素集合s2。如下圖所示。應使用哪個樞軸項?若陣列元素的隨機排列,則可隨機地選擇樞軸項。

例如,可將thearray[first]選作樞軸項。在開發分割槽時,不管選擇哪個樞軸項,將樞軸項放在thearray[first]的位置會更方便。準備放到s1和s2區域的元素全部都在陣列的另一區域,稱為未知區域。陣列索引first、lasts1、firstunknow 和 last 按上述劃分陣列。樞軸項和未知區域(thearray[firstunknow...last])元素的關係同樣未知!

在整個分割槽過程中,下面的描述一定為真:

區域s1的元素都小於樞軸項,而區域s2的元素都大於等於樞軸項。

上述語句是劃分演算法的不變式。為是不變式在劃分演算法開始時為真,必須將陣列索引初始化為以下形式,使未知區域涵蓋除樞軸項之外的要分割槽的所有陣列段。

lasts1=first

firstunknown=first+1;

劃分演算法的每個步驟分析未知區域的一項,確定它屬於s1還是屬於s2,並將其放入適當的位置。這樣,未知區域的大小每次減1,當未知區域的大小為0時,即firstunknow>last時演算法終止。

#includeusing namespace std; int find(int arr,int first,int last); void sort(int arr,int first,int last); int main() ; for(int i=0;i=arr[firstunknow]) } temp=arr[first]; arr[first]=arr[lasts1]; arr[lasts1]=temp; return lasts1; } void sort(int arr,int first,int last) { if(first

快速排序 QuickSort

快速排序通常用於排序的最佳的使用選擇,其期望執行時間為 o nlgn 能夠進行就地排序。最壞執行時間為 o n 2 演算法描述 分解 divide 陣列 a beg end 被劃分為兩個子陣列 a beg mid 1 和a mid 1 end 使得a beg mid 1 中的資料都小於 a mid ...

快速排序 quicksort

快速排序 quicksort 是分治法的典型例子,它的主要思想是將乙個待排序的陣列以陣列的某乙個元素x為軸,使這個軸的左側元素都比x大,而右側元素都比x小 從大到小排序 然後以這個x在變換後陣列的位置i分為左右兩個子陣列,再分別進行快速排序,直到子陣列中只有乙個元素為止。快速排序演算法如下 void...

快速排序 QuickSort

1,void quicksort int a,int low,int high 這個函式是排序的遞迴部分,mid就是已經確定的基準元素的位置。2,int partition int a,int low,int high 這個函式幹了兩件事 1 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...