演算法學習之快速排序

2021-07-26 05:40:01 字數 1194 閱讀 4074

快速排序在平均狀況下時間複雜度o(nlogn),快速排序法是氣泡排序的進化版本,在最差情況下他們的時間複雜度是一樣的(o(n2)),但是在平均狀況下其時間複雜度較氣泡排序更低,快速排序是一種不穩定的演算法。

快速排序演算法的思想:

上圖有長度不相同次序混亂的條形圖(可看作陣列中大小不同的資料),選擇任意乙個位置的資料為出發點,例如選擇第一條關鍵資料為紅色箭頭所指的資料,從陣列最右側開始與關鍵資料對比,如果小於關鍵資料,就把他放在關鍵資料的左邊,如果大於關鍵資料,不做移動,比較移動完畢後,第一次遍歷完畢,遍歷玩所有資料就得到了有序陣列

快速排序演算法的**實現:

public void sort(int data,int low,int hight)

int l = low;

int h = hight;

int list = data;

//預設比較的關鍵數字是key = list[l],記作key,在一次遞迴中,key的值是不變的,只是key的位置在改變

while(h>l)

h--;

} while(llist[h])

l++;

} sort(list, low, l-1);//遞迴 l是乙個關鍵的數,它記錄了最後一次移動後key所在的陣列下標,只有確定了第一次排序完成後key的位置,

sort(list, l+1, hight);//才能確定接下來的遞迴排序所傳遞的引數

}

演算法的排序在sort方法的兩個while語句中,執行的是從陣列結尾開始尋找,找在key右側第乙個小於key的數字,把他與key互換位置,然後再從陣列起始位開始尋找,找到第乙個比key的值大的,並且與key互換位置,l記錄最後一次交換後的key的下標,這樣每次排序完畢後,就能確定key關鍵字的左側均是小於key的數,key關鍵字的右側均是大於key的數。

遞迴函式的引數:

第乙個sort函式,陣列的第乙個引數是待排序陣列,第二個引數是下次排序的起始位置,第三個引數是帶排序陣列的結束部分(為key所在的下標-1)

第二個sort函式,陣列的第乙個引數是待排序陣列,第二個引數是下次排序的起始位置,第三個引數是帶排序陣列的結束部分(為key所在的下標+1)

這樣就把陣列遞迴分割成多個待排序的陣列直到待排序的陣列的長度為1

演算法學習 快速排序

快速排序 分治演算法 const int n 1e6 10 int a n a 待排序陣列,l 排序陣列的起始下標,r 排序陣列的結束下標 void quick sort int a,int l,int r 遞迴的終止條件 int x a l 選取排序的比較物件 int i l 1 設定排序的左指標...

演算法學習 快速排序

1 基本思想 取待排序陣列第乙個數作為參照數,建立left和right陣列,left儲存小於參照數的陣列集合,right儲存大於參照數的陣列集合,然後分別對left和right進行遞迴呼叫排序。2 舉例 11,2,3,43,23,5,6,9,10 取任意的乙個數為基準數 temp arr 0 遍歷陣...

排序演算法學習 快速排序

快速排序 作為氣泡排序的一種改進 通過設定乙個標誌值 通常為陣列第乙個元素pivot 一次快排將陣列分成兩個部分,一部分 公升序 前一部分 小於標誌值pivot,另一部分大於標誌值 公升序 後面部分 各部分內部可以是 通常也是 無序的。通過遞迴地呼叫這樣的排序,使得最終陣列所有的元素有序。一次具體的...