VSCode 配 uni-app
阿新 • • 發佈:2020-07-11
- 快速排序
- 快速排序是一個知名度極高的排序演算法,其對於大資料的優秀排序效能和相同複雜度演算法中相對簡單的實現使它註定得到比其他演算法更多的寵愛。
- 快速排序使用分治法(Divide and conquer)策略來把一個序列(list)分為兩個子序列(sub-lists)。
- 快速排序又是一種分而治之思想在排序演算法上的典型應用。本質上來看,快速排序應該算是在氣泡排序基礎上的遞迴分治法。
- 演算法描述
-
從數列中挑出一個元素,稱為"基準"(pivot),
-
重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作。
-
遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序。
-
-
動圖演示
- 圖解
-
我們隨機取一個數字作為基準元素,為了方便,取第一個數字為基準元素,基準元素取為6;設定兩個指標 i 和 j,它們分別指向陣列的第一個元素和陣列最後一個元素,即i=0,j=9。
- 首先讓指標 j 開始向左挪動,直到找到一個小於6的數停下來。切換到指標 i 再向右挪動,直到找到一個數大於6的數停下來。最後指標 j 停在了數字 1上,指標 i 停在了數字8上。讓指標 i 和指標 j 指向的元素進行交換位置。
-
-
第一次排序完成,接著進行第2次排序,指標 j 繼續向左移動,由於3 < 6 ,指標 j 停下來;接著指標 i 開始向右繼續移動,由於 9 > 6,停下來,9與3進行交換位置。
第2次排序結束,繼續進行第3次排序,指標 j 繼續向左移動,移動到數字5的位置,由於5 < 6 ,指標 j 停下來;接著指標 i 開始向右繼續移動,此時 指標 i 與 指標 j 重合,把重合點的元素5與基準元素6交換位置,這一輪迴圈停止執行。
- 演算法實現
public static void quickSort(int[] arr){ qsort(arr, 0, arr.length-1); } private static void qsort(int[] arr, int low, int high){ if (low >= high)
- 適用場景
- 快速排序在大多數情況下都是適用的,尤其在資料量大的時候效能優越性更加明顯。但是在必要的時候,需要考慮下優化以提高其在最壞情況下的效能。