1. 程式人生 > >快排--java實現

快排--java實現

快速排序思想

  快速排序的思想,尋找一個軸位,比這個軸小的放到左邊,比這個軸大的放到右邊,然後分別再對兩邊進行如此的方法即可得到排序的陣列。

  這樣說起來晦澀難懂,我們舉個例子來實現。

  例如陣列:{13,19,9,5,12,8,7,4,21,2,6,11},選取末位11為軸,

  第一次遍歷得到:{13,19,9,5,12,8,7,4,21,2,6,11}

  第二次遍歷得到:{13,19,9,5,12,8,7,4,21,2,6,11}

  第三次遍歷得到:{9,19,13,5,12,8,7,4,21,2,6,11}

  第四次遍歷得到:{9,5,13,19,12,8,7,4,21,2,6,11}

  第五次遍歷得到:{9,5,13,19,12,8,7,4,21,2,6,11}

  第六次遍歷得到:{9,5,8,19,12,13,7,4,21,2,6,11}

  第七次遍歷得到:{9,5,8,7,12,13,19,4,21,2,6,11}

  第八次遍歷得到:{9,5,8,7,4,13,19,12,21,2,6,11}

  第九次遍歷得到:{9,5,8,7,4,13,19,12,21,2,6,11}

  第十次遍歷得到:{9,5,8,7,4,2,19,12,21,13,6,11}

  第十一次遍歷得到:{9,5,8,7,4,2,6,12,21,13,19,11}

  最後我們把原來的軸11與中間位置12交換得到:{9,5,8,7,4,2,6,11

,21,13,19,12}

 

  我們開始排列兩邊,{9,5,8,7,4,2,6} 和{21,13,19,12}

  我們選取6和12分別為兩邊的軸,開始新的一輪遍歷,

  第一次遍歷:{9,5,8,7,4,2,6}  ,   {21,13,19,12}

  第二次遍歷:{5,9,8,7,4,2,6}  ,  {21,13,19,12}

  第三次遍歷:{5,9,8,7,4,2,6}  ,  {21,13,19,12}

  第四次遍歷:{5,9,8,7,4,2,6}  ,  無

  第五次遍歷:{5,4,8,7,9,2,6}  ,  無

  第六次遍歷:{5,4,2

,7,9,8,6}  ,  無

  最後我們把原來的軸6和中間位置7交換,得到:{5,4,2,6,9,8,7}   。把原來的軸12和中間位置21交換,得到:{12,13,19,21}

 

  我們分成了小陣列:{5,4,2} 和{9,8,7} 和{13,19,21},分別以2和7,21為軸進行新一輪的遍歷

  第一次遍歷:{5,4,2}  ,  {9,8,7}  ,  {13,19,21}    注意:13和13自己進行交換,

  第二次遍歷:{5,4,2}  ,  {9.8.7}  ,  {19,13,21}    

  最後我們把原來的軸2和中間位置5交換,得到:{2,4,5}。把原來的軸7和中間位置9交換,得到:{7,8,9}。把原來的軸21和中間位置21交換,得到{19,13,21}

 

  我們分成小陣列:{2,4}和{7,8}和{19,13},分別以4,8,13為軸,開始新的一輪遍歷。

  第一次遍歷:{2,4}  ,  {7,8}  ,  {19,13}

  這裡已經結束遍歷,原來的軸和中間位置交換,得到{2,4}     {7,8}    {13,19} 。 自此遍歷結束,得到了順序的陣列。

  注意:(1)這裡的“中間位置”,並不是說的位置上的中間,而是指的是軸的中間位置,也就是說,這個中間位置是左邊的比軸小,右邊的比軸大!!!

     (2)這裡的紅色標誌表示交換,如果是有一個紅色的表示自己和自己交換!!!

 

java程式碼實現

  程式設計師還是用程式碼來說事,這麼多文字,大家可能會看不下,那就看下程式碼,不明白的可以對照上面的順序來屢屢。

 1 /**
 2      * 快排
 3      * @param arr
 4      * @param low
 5      * @param high
 6      */
 7     private void quickS(int[] arr,int low,int high){
 8 
 9         if(low > high){
10             return;
11         }
12         int mid = getMid(arr,low,high);
13         quickS(arr,low,mid-1);
14         quickS(arr,mid+1,high);
15     }
16 
17     /**
18      * 獲取中間位置
19      * @param arr  待排序的陣列
20      * @param low   最低位置
21      * @param high  最高位置
22      * @return
23      */
24     private int getMid(int[] arr,int low,int high){
25         if(low > high){
26             return -1;
27         }
28         int max = arr[high];
29         int i = low;
30         int temp = 0;
31         while(low < high){
32             if(max > arr[low]){
33                 temp = arr[i];
34                 arr[i]=arr[low];
35                 arr[low]=temp;
36                 i++;
37             }
38             low++;
39         }
40         temp = arr[i];
41         arr[i] = arr[high];
42         arr[high] = temp;
43         return i;
44     }
45 
46     @Test
47     public void testQS(){
48         int arr[]={13,19,9,5,12,8,7,4,21,2,6,11};
49         quickS(arr,0,11);
50         for(int i = 0; i < arr.length; i++){
51             System.out.print(arr[i]+"   ");
52         }
53     }

 

附上另一種方法:

/**
     * 快排
     * @param array
     */
    private void quickSort(int[] array){
        int high = array.length-1,low=0;
        subSort(array,high,low);
        for(int i = 0; i<array.length; i++){
            System.out.println(array[i]);
        }
    }

    private int getMiddle(int[] array,int high,int low){

        int key = array[low];
        while (low < high) {
            while (low < high && array[high] >= key){
                high--;
            }
            array[low] = array[high];
            while (low < high && array[low] <= key){
                low++;
            }
            array[high] = array[low];
        }
        array[low] = key;
        return low;
    }

    private void subSort(int[] array,int high,int low){
        if(low>high){
            return;
        }
        int result = getMiddle(array, high, low);
        subSort(array,result - 1,low);
        subSort(array, high,result + 1);
    }

總結

  快速排序主要是掌握方法,其中獲取中間位置的演算法是核心演算法,這裡是排序的關鍵,做什麼事情勢必要親身嘗試,哪怕錯了可以重頭再來!!!