Java中的經典算法之快速排序(Quick Sort)

Java中的經典算法之快速排序(Quick Sort)

快速排序的思想

基本思想是:經過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的全部數據都比另一部分的全部數據都要小,
而後再按此方法對這兩部分數據分別進行快速排序,整個排序過程能夠遞歸進行,以此達到整個數據變成有序序列。java

假定數組A:46 30 82 90 56 17 95 15,取第一個數46位基數,l=0(l是字母,不是數字1)指向第一個數,h=7指向最後一個數:算法

從右向左找出第一個小於46的數;先比較A[0]和A[7]:
    46 30  82  90  56  17  95  15
    =》46和15比較=》15  30  82  90  56  17  95  46:交換位置,此時l須要+1變爲l=1;h=7
    (若是以前比較沒有找到小於46的數,則繼續取h=6位置的數和46比較,直到取到小於46的數爲止)

而後從左向右找出第一個大於46的數:比較A[1]和A[7]:
    15  30  82  90  56  17  95  46
    =》30和46比較=》15  30  82  90  56  17  95  46:未交換位置,繼續取左邊下一個數字,

繼續從左向右找出第一個大於46的數,此時因此l=2;h=7;比較A[2]和A[7]:
    15  30  82  90  56  17  95  46
    =》82和46比較=》15  30 46 90  56  17  95  82:交換位置

此時須要從右向左再找出下一個比46小的數,因此l=2,h=6,比較A[2]和A[6]:
    15  30 46 90  56  17  95  82
    =》46和95比較=》15  30 46 90  56  17  95  82:未交換位置

繼續從左向右找比46小的數字,此時l=2,h=5,比較A[2]和A[5]:
    15  30 46 90  56  17  95  46
    =》46和17比較=》15  30  17  90  56 46 95  82:交換位置

再從左向右找比46大的數字,此時l=3,h=5;比較A[3]和A[5]:
    15  30  17  90  56 46 95  82
    =》90和46比較=》15  30  17 46 56  90  95  82:交換位置

再從右向左找比46小的數字,此時l=3,h=4; 比較A[3]和A[4]:
    15  30  17 46 56  90  95  82
    =》46和56比較=》15  30  17 42 56  90  95  82:爲交換位置

繼續從右向左找比46小的數字,此時l=3,h=3,l==h;此時A[3]左邊數字(15,30,17,)所有是小於右邊數字(90,95,82)的;

而後對子序列各自進行如上排序,直到子序列元素個數不大於1爲止;
public static void main(String[] args) {
        int[] a = {46, 30, 82, 90, 56, 17, 95, 15};
        int start = 0;
        int end = a.length - 1;
        sort(a, start, end);
        for (int anA : a) {
            System.out.println(anA);
        }
    }

    public static void sort(int arr[], int low, int high) {
        int l = low;
        int h = high;
        int baseNum = arr[low];

        while (l < h) {
            //1.從右向左查找小於指定基數的數,找到以後跳出循環執行下面if循環,交換數據
            while (l < h && arr[h] >= baseNum) {
                h--;
            }
            //交換數據
            if (l < h) {
                int temp = arr[h];
                arr[h] = arr[l];
                arr[l] = temp;
                l++;
            }

            //2.從左向右查找大於指定基數的數,找到後跳出循環執行下面if循環,交換數據
            while (l < h && arr[l] <= baseNum)
                l++;
            //交換數據
            if (l < h) {
                int temp = arr[h];
                arr[h] = arr[l];
                arr[l] = temp;
                h--;
            }
        }
        if (l > low) {
            sort(arr, low, l - 1);
        }
        if (h < high) {
            sort(arr, l + 1, high);
        }
    }

輸出結果:數組

15
17
30
46
56
82
90
95ui

相關文章
相關標籤/搜索