1. 程式人生 > 實用技巧 >【演算法日記】馬拉車

【演算法日記】馬拉車

快速排序(QuickSort)是對氣泡排序的一種改進。基本思想是:通過一趟排序將需要排序的資料分成獨立兩部分,其中一部分的所有資料都比另一部分的所有資料都要小,然後再按照此方法對這兩組資料分別進行快速排序,這個排序過程可以遞迴進行,以此達到整個資料變成有序序列。

一、基本介紹


快速排序是實踐中的一種快速的排序演算法,在對 Java基本型別的排序中特別有用。它的平均執行時間是。該演算法之所以特別快,主要是由於非常精練和高度優先的內部迴圈(遞迴)。它的最壞情形效能為,但進行簡單修改就可以使該情形極難出現。下面描述最常見的快速排序的實現 “經典快速排序”。原理視訊:連結

二、快速排序程式碼演示


首先理解快速排序的思想,繼而根據思想編寫程式碼即可。

 1 /**
 2  * 快速排序:思想:先將最後一個元素獲取出來,作為樞紐元(pivot),開始移動左右指標
 3  */
 4 public class QuickSort {
 5 
 6     public static void main(String[] args) {
 7         Integer[] a = {44,33,66,2,4,88,44,62,49,23,43,89,50};
 8         //Integer[] a = {44,44,44,44,44,44,44,44,44,44,44,44,50};
9 new QuickSort().sort(a,0,a.length-1); 10 List<Integer> ints = Arrays.asList(a); 11 for(int i: ints){ 12 System.out.printf(i + " "); 13 } 14 } 15 16 //傳入目標陣列,左索引和右索引 17 public void sort(Integer[] arr , int left, int right){ 18 int
l = left; 19 int r = right-1; 20 21 //當 left < right 的情況下進行無限迴圈 22 while(left < right && l >= 0 && r >= 0 && l < right && r < right){ 23 24 //迴圈獲取 l > 最後一個元素的資料 25 while(arr[l] < arr[right]){ 26 l++; 27 } 28 29 //迴圈獲取 R < 最後一個元素的資料,這裡新增等於是防止大量相同的元素的時候,r和l指標都不移動則會出現問題; 30 while(arr[r] >= arr[right] && r > 0){ 31 r--; 32 } 33 34 //如果l 與 r 指標符合邏輯則交換彼此的資料 35 if(l < r){ 36 //交換資料 37 swap(arr , l, r); 38 //如果兩個相等,或者l > r 那麼就說明比較結束,交換 l 與樞紐元 pivot 39 }else{ 40 swap(arr , l, right); 41 //遞迴呼叫:對最左邊的進行排序,l是當前的中間值 42 //注意這裡不要使用 --l 因為 --l 會改變l的值,舉個例子,L=6時,--L後l=5 L-1 後 L=6 ,我們後面的 l+1需要初始的L值所以,不要使用 L-- 43 sort(arr , left, l-1); 44 //遞迴呼叫:對最右邊的進行排序,l是當前的中間值 45 sort(arr , l+1,right); 46 break; 47 } 48 } 49 } 50 //交換方法 51 public void swap(Integer[] arr ,int i,int j){ 52 int temp = arr[i]; 53 arr[i] = arr[j]; 54 arr[j] = temp; 55 } 56 }