(排序)快速排序QuickSort

2021-09-08 10:55:50 字數 2364 閱讀 2353

主要內容:

1、演算法思想

2、快速排序演算法

3、劃分演算法partition

4、快排過程**

5、完整**

快速排序是c.r.a.hoare於2023年提出的一種劃分交換排序。它採用了一種分治的策略,通常稱其為分治法(divide-and-conquermethod)。

(1) 分治法的基本思想

分治法的基本思想是:將原問題分解為若干個規模更小但結構與原問題相似的子問題。遞迴地解這些子問題,然後將這些子問題的解組合為原問題的解。

(2)快速排序的基本思想

設當前待排序的無序區為r[low..high],利用分治法可將快速排序的基本思想描述為:

①分解divide:

在r[low..high]中任選乙個元素作為基準(pivot),以此基準將當前無序區劃分為左、右兩個較小的子區間r[low..pivotpos-1)和r[pivotpos+1..high],並使左邊子區間中所有記錄的關鍵字均小於等於基準記錄(不妨記為pivot)的關鍵字pivot.key,右邊的子區間中所有記錄的關鍵字均大於等於pivot.key,而基準記錄pivot則位於正確的位置(pivotpos)上,它無須參加後續的排序。

②求解divide:

通過遞迴呼叫快速排序對左、右子區間r[low..pivotpos-1]和r[pivotpos+1..high]快速排序。

③組合conquer:

因為當"求解"步驟中的兩個遞迴呼叫結束時,其左、右兩個子區間已有序。對快速排序而言,"組合"步驟無須做什麼,可看作是空操作。

複雜度分析:

最好的複雜度o(nlogn),每次partition時,pivot皆為中值。

最壞複雜度o(n^2),陣列本身已是有序的。

partition過程會破壞陣列元素間的相對順序,所以快排不是穩定的排序。如[2,2,1]

void quicksort(vector &num,int i,int

j)}

第一步:(初始化)設定兩個指標i和j,它們的初值分別為區間的下界和上界,即i=low,i=high;選取無序區的第乙個記錄r[i](即r[low])作為基準記錄,並將它儲存在變數pivot中;(pivot的選擇有三種方法,一種是選擇區間的第乙個或者最後乙個,一種是選擇區間的任意乙個,還有一種是選擇區間首、中、尾三者的中值)。

第二步:令j自high起向左掃瞄,直到找到第1個關鍵字小於pivot.key的記錄r[j],將r[j])移至i所指的位置上,這相當於r[j]和基準r[i](即pivot)進行了交換,使關鍵字小於基準關鍵字pivot.key的記錄移到了基準的左邊,交換後r[j]中相當於是pivot;然後,令i指標自i+1位置開始向右掃瞄,直至找到第1個關鍵字大於pivot.key的記錄r[i],將r[i]移到i所指的位置上,這相當於交換了r[i]和基準r[j],使關鍵字大於基準關鍵字的記錄移到了基準的右邊,交換後r[i]中又相當於存放了pivot;接著令指標j自位置j-1開始向左掃瞄,如此交替改變掃瞄方向,從兩端各自往中間靠攏,直至i=j時,i便是基準pivot最終的位置,將pivot放在此位置上就完成了一次劃分。

快速排序 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 挑出來乙個基準元素 這裡選的是最後乙個作為基準 找它的正...