Java 快速排序 看著一片就夠了
阿新 • • 發佈:2018-12-11
樓主在複習快速排序的時候發現了很多問題,其中也參照了大神的程式碼,進行了程式碼的詳細說明
大神程式碼地址,有很好的圖例說明 請點選
- 我的程式碼實現
package sort; public class QuickSort { /** * 快速排序 * <p> * 從數列中挑出一個元素,稱為“基準” * 重新排序數列,所有元素比基準值小的擺放在基準前面,所有元素比基準值大的擺在基準的後面(相同的數可以到任一邊)。 * 在這個分割之後,該基準是它的最後位置。這個稱為分割(partition)操作。 * 遞迴地把小於基準值元素的子數列和大於基準值元素的子數列排序。 * * @param arr 陣列 * @param low 開始 * @param high 結束 */ public static void quickSortRightMax(int[] arr, int low, int high) { if (low > high) { return; } int i = low; int j = high; int key = arr[i]; int temp = 0; while (i < j) { while ((arr[j] >= key) && (j > i)) { /*從後往前比較 如果沒有比關鍵key小的,比較下一個,直到找到比關鍵key小的 */ j--; } while ((arr[i] <= key) && (j > i)) { /*從往前往後比較 如果沒有比關鍵key大的,比較下一個,直到找到比關鍵key大的 */ i++; } if (i < j) { //找到了比關鍵key大的值,和比Key小的值,調換位置 temp = arr[j]; arr[j] = arr[i]; arr[i] = temp; } } // 此時哨兵i和哨兵j相遇了,哨兵i和哨兵j都走到key面前。 // 說明此時“探測”結束。我們將基準數arr[low]也就是Key所代表的值和arr[i]進行交換。 arr[low] = arr[i]; arr[i] = key; // 交換完了之後,就是以基準Key分成了2部分,左邊是小於key的,右邊是大於key的 // 比如: int arr2[] = new int[]{6,1,2,7,9,3,4,5,10,8}; // 現在變成了 3,1,2,5,4,6,9,7,10,8左邊是3,1,2,5,4 右邊是9,7,10,8 // 接下來還需要分別處理這兩個序列。 // 左邊的序列是“3 1 2 5 4”。 // 請將這個序列以3為基準數進行調整,使得3左邊的數都小於等於3,3右邊的數都大於等於3。 System.out.println(i == j); System.out.println("==============="); //遞迴呼叫左半陣列,因為此時i=j,所以用i j都行 quickSortRightMax(arr, low, j - 1); //遞迴呼叫左半陣列 quickSortRightMax(arr, j + 1, high); } public static void main(String[] args) { int arr2[] = new int[]{6, 1, 2, 7, 9, 3, 4, 5, 10, 8, 11}; quickSortRightMax(arr2, 0, arr2.length - 1); System.out.println("------------"); for (int i = 0; i < arr2.length; i++) { System.out.println(arr2[i]); } } }
- 注意事項
這裡比較的時候不管是《= 還是》= 都要帶=號,因為我們要找的是比它小的,或者大的 ((arr[i] <= key) && (j > i)) 還有明明外邊已經有
i< j
了為什麼裡面還要有?這是必須的,因為裡面在做++ 和——運算
- 時間和空間複雜度