八大排序(三) 快速排序

2021-08-19 18:44:28 字數 1256 閱讀 6885

快速排序的基本思想如下:

設要排序的陣列是a[0]……a[n-1],首先任意選取乙個資料(通常選用陣列的第乙個數)作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得注意的是,快速排序是一種不穩定的排序演算法,也就是說,多個相同的值的相對位置也許會在演算法結束時產生變動。

一趟快速排序的演算法過程如下:

1)設定兩個變數i、j,排序開始的時候:i=0,j=n-1;

2)以第乙個陣列元素作為關鍵資料,賦值給key,即key=a[0];

3)從j開始向前搜尋,即由後開始向前搜尋(j–),找到第乙個小於key的值a[j],將a[j]和a[i]互換;

4)從i開始向後搜尋,即由前開始向後搜尋(i++),找到第乙個大於key的a[i],將a[i]和a[j]互換;

5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中a[j]不小於key,4中a[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到為止。找到符合條件的值,進行交換的時候i, j指標位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令迴圈結束)。

可以結合下圖直觀的理解:

經過以上操作步驟後,完成了第一次的排序,得到新的陣列:1、2、5、4、3。

新的陣列中,2為分割點,左邊都是比2小的數,右邊都是比2大的數。然後將2的左右兩邊再進行以上的排序操作。

快速排序的具體**如下:

快速排序:

public

float quicksort(float array)

// 快速排序

public

void quicksortcore(float array, int left, int right) else

if (j > i)

while (array[i] <= base && j > i)

if (j > i)

}array[i] = base;

quicksortcore(array, left, i - 1);

quicksortcore(array, i + 1, right);}}

快速排序的平均時間複雜度θ(nlogn)。

ref:

快速排序演算法

排序二 快速排序

八大排序(三)快速排序

快速排序是在實際中最常用的一種排序演算法,速度快,效率高,就像名字一樣,快速排序是最優秀的一種排序演算法。雖然在c 中可以直接呼叫sort進行快排,但還是需要了解他的原理 快速排序採用分治的思想 因此我在這裡簡單介紹一下分治,簡單來說就是 分而治之 把乙個複雜的問題分成兩個或更多的相同或相似的子問題...

八大排序(五)快速排序

快速排序使用了分治策略。一 選定乙個基準數 一般選取第乙個數 然後把大於它的數都放在它右邊,把小於它的數放左邊。二 這樣就把陣列分成左右兩部分。再將左右兩部分分別遞迴執行第一步,最終當執行第一步的部分大小為一時,遞迴完成,原陣列排序完成。public class quicksort 將剛剛找到的數插...

八大排序之快速排序

快速排序 public class quicksort int arr 測試時間複雜度 o n 2 int arr new int 80000 for int i 0 i arr.length i long start time system.currenttimemillis quicksort ...