快速排序演算法和優化

2021-09-28 19:47:10 字數 1931 閱讀 4356

快速排序演算法又稱為劃分交換排序,是對氣泡排序的一種改進,還是採用分治法

左右指標法

先設定乙個關鍵字key作為比較物件(一般取陣列的最前或最後的數),key=length-1

設定兩個變數left=0,right=length-1

left一直往後走,直到找到乙個大於key的值,left停下;此時right一直往前走直到找到乙個小於key的值,停下;此時兩數交換

重複操作,直到left和right同時指向乙個數的時候,將key於此數交換

此時,key左面的是比key小的,key右面的是比key大的,使用遞迴,呼叫自己,最後完成排序

//遞迴體

int i=left;

int j=right;

int index=a[left]

;while

(i!=j)

while

(a[i]

<=index&&i

if(i

(i==j)

quicksort

(a,left,i-1)

;quicksort

(a,i+

1,right)

;}需要注意的是,如果定義的key是最左邊的,那麼快速排序演算法必須從最右邊開始,即所謂的右哨兵先行

因為我們是從最左面的值作為key,根據正常的情況我們要把陣列分為兩塊,左面是小的,右面是大的,若左哨兵先行,那麼從左哨兵開始,比他小的數他都不會停留,比如:(5,4,2,3,6),這種情況,4,2,3這三個數,是不會互換位置的,那麼在進行分治也只是小規模的互換,其本質的還是沒有發生改變

由此,迴圈的開始必須是基準數的對面

挖坑法先選定基準值(本次選定a[right]為基準值),作為比較物件,並用index儲存此基準值

然後定義左右兩個指標,分別指向陣列左右兩端

從基準值對面的left開始遍歷,找到乙個比基準值大的數,並將他的值賦值給基準值所在的位置(此時,陣列中會有兩個相等的a[i],且i會在他做指定的位置不動)

然後right開始從他所在的位置開始向左遍歷,直到找到乙個比基準值小的數,並將他的值賦給剛才i所停留的位置(此時,陣列中會有兩個相等的a[j],且j會在他做指定的位置不動)

重複前兩步

直到i=j的時候,此時陣列中至少會有兩個值為a[i],此時把基準值index賦值給a[i]

這時,index左面的都是比index小的數,index右面的都是比index大的數,重複此遞迴方法…

public

static

void

quicksort

(int

a,int left,

int right)

int i=left;

int j=right;

int index=a[right]

;while

(ia[j]

=a[i]

;while

(i>=index)

a[i]

=a[j];}

if(i==j)

quicksort

(a,left,i-1)

;quicksort

(a,i+

1,right)

;}

快速排序常見的優化有:固定切分、隨機切分、三數取中

固定切分的效率不是太好

隨機切分雖然效率高,但是隨機性比較高

三數取中選擇基準點是最理想的

快速排序及其優化和快速選擇演算法

本文主要內容是快速排序的 編寫及其優化,還有快速選擇演算法 在無序的數中尋找第k大或小的元素 上 include include include include include include include include include include using namespace std d...

演算法導論 快速排序優化演算法!

常見快速排序 時間複雜度最好情況下o nlgn 最壞情況o n2 快速排序是基於分治模式的 分解 陣列a p.r 被劃分成兩個 可能空 子陣列a p.q 1 和a q 1.r 使得a p.q 1 中的每個元素都小於等於a q 而且,小於等於a q 1.r 中的元素。下 標q 也在返個劃分過程中迕行計...

基本排序演算法 快速排序演算法及其優化

快速排序 就是在乙個陣列中先選取乙個參考值v 基準 並將陣列分為小於基準和不小於基準的兩部分 快速排序的基本版 並遞迴將左右部分兩部分繼續分別快速排序,用到了分治的演算法思想,將乙個大問題分解成一系列有相同特點或性質的子問題,當子問題仍無法解決時繼續遞迴劃分,直到子問題可以被解決為止,這樣只要將子問...