1. 程式人生 > 其它 >list按照某個欄位排序_Java快速排序法(Quicksort)

list按照某個欄位排序_Java快速排序法(Quicksort)

技術標籤:list按照某個欄位排序list排序list根據某個欄位排序快速排序 java快速排序java快速排序java程式碼

快速排序(Quicksort)是對氣泡排序的一種改進,是一種排序執行效率很高的排序演算法。快速排序的基本思想是:通過一趟排序,將要排序的資料分隔成獨立的兩部分,其中一部分的所有資料比另外一部分的所有資料都要小,然後再按此方法對這兩部分資料分別進行快速排序,整個排序過程可以遞迴進行,以此使整個資料變成有序序列。具體做法是:假設要對某個陣列進行排序,首先需要任意選取一個數據(通常選用第一個資料)作為關鍵資料,然後將所有比它小的數都放到它的前面,所有比它大的數都放到它的後面。這個過程稱為一趟快速排序;遞迴呼叫此過程,即可實現資料的快速排序。

例 1

利用快速排序法對一陣列進行排序,實現步驟如下。(1) 宣告靜態的 getMiddle() 方法,該方法需要返回一個 int 型別的引數值,在該方法中傳入 3 個引數。程式碼如下:

public static int getMiddle(int[] list, int low, int high) {    int tmp = list[low]; // 陣列的第一個值作為中軸(分界點或關鍵資料)    while (low < high) {        while (low < high && list[high] > tmp) {            high--;        }        list[low] = list[high]; // 比中軸小的記錄移到低端        while (low < high && list[low] < tmp) {            low++;        }        list[high] = list[low]; // 比中軸大的記錄移到高階    }    list[low] = tmp; // 中軸記錄到尾    return low; // 返回中軸的位置}

(2) 建立靜態的 unckSort() 方法,在該方法中判斷 low 引數是否小於 high 引數,如果是則呼叫 getMiddle() 方法,將陣列一分為二,並且呼叫自身的方法進行遞迴排序。程式碼如下:

public static void unckSort(int[] list,int low,int high) {    if(low < high) {        int middle = getMiddle(list,low,high);    // 將list陣列一分為二        unckSort(list,low,middle-1);    // 對低字表進行遞迴排序        unckSort(list,middle+1,high);    // 對高字表進行遞迴排序    }}

(3) 宣告靜態的 quick() 方法,在該方法中判斷傳入的陣列是否為空,如果不為空,則呼叫 unckSort() 方法進行排序。程式碼如下:

public static void quick(int[] str) {    if(str.length > 0) {        // 檢視陣列是否為空        unckSort(str,0,str.length-1);    }}

(4) 在 main() 方法中宣告 int 型別的 number 陣列,接著輸出該陣列中的元素。然後呼叫自定義的 quick() 方法進行排序,排序後重新輸出陣列中的元素。程式碼如下:

int[] number={13,15,24,99,14,11,1,2,3};System.out.println("排序前:");for(int val:number) {    System.out.print(val+" ");}quick(number);System.out.println("\n排序後:");for(int val:number) {    System.out.print(val +" ");}

執行前面的程式碼進行測試,輸出結果如下:

排序前:
13 15 24 99 14 11 1 2 3
排序後:
1 2 3 11 13 14 15 24 99

b94d5898f5380f463e10f0624be6c16e.png