快速排序

一、原理

1. 從待排序區間選擇一個數,作爲基準值(index);
2. Partition: 遍歷整個待排序區間,將比基準值小的(可以包含相等的)放到基準值的左邊,將比基準值大的(可以包含相等的)放到基準值的右邊;
3. 採用分治思想,對左右兩個小區間按照同樣的方式處理,直到小區間的長度 == 1,代表已經有序,或者小區間的長度 == 0,代表沒有數據。

二、圖解

1.以{1, 3, 6, 5, 0, 2}爲例,將較小的數換在左邊,反之在右邊。
快速排序
將最右邊的數作爲基準值,right先從右邊向左找第一個比基準值2小的數,找到爲0;left再從左邊向右找第一個比基準值大的數,找到爲3,交換這兩個數。

2.
快速排序
在1.的基礎上,right先走,從右往左找第一個比基準值2小的數,我們發現,此時right和left相遇了,將相遇的值與基準值2比較,相遇的值比基準值大,所以我們交換兩個數。

3.
快速排序
現在,第一趟比較已經結束,數字2相當於已經歸位了,所以我們以2爲分界線,分別比較2左邊的數和2右邊的數,比較方法和上面的一樣。最後我們會得到一組有序的數。

三、代碼實現

public static void quickSort(int[] array) {   //快速排序

        quickSortHelper(array, 0, array.length - 1);
    }
    private static void quickSortHelper(int[] array, int left, int right) {
        if (left >= right) {
            return;
        }
        int index = partition(array, left, right);
        quickSortHelper(array,left, index - 1);
        quickSortHelper(array, index + 1,right);
    }
    private static int partition(int[] array, int left, int right) {
        int index = right; //基準值
        while (left < right) {
            while (left < right && array[left] <= array[index]) {
                left++;
            }
            while (left < right && array[right] >= array[index]) {
                right--;
            }
            swap(array, left, right);
        }
        swap(array, left, index);
        return left;
    }
    public static void swap (int[] array, int x, int y) {
        int tmp = array[x];
        array[x] = array[y];
        array[y] = tmp;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章