數據結構和算法(三) 快速排序-分治

介紹:

快速排序(Quicksort)是對冒泡排序的一種改進。
它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據都比另外一部分的所有數據都要小,然後再按此方法對這兩部分數據分別進行快速排序,整個排序過程可以遞歸進行,以此達到整個數據變成有序序列。

解析:

有數組A,取一個基準值,通過一輪排序的算法後,數組被基準值拆分爲兩部分,前部分小於等於基準值,後部分大於基準值。將得到前部分數組和後部分數組繼續遞歸調用排序算法。直到排序完成。

僞代碼:
排序(A, p, r) {
    if (p < r) {
	    q = 排序子方法(A, p, r)
	    排序(A, p, q-1)
	    排序(A, q+1, r)
    }
}
排序子方法(A, p, r) {
    x = A[r]
    i = p - 1
    for (j = p  to  r -1 ) {
        if (A[j] <= x) {
            i = i + 1
            A[i] 和 A[j] 交換
        }
    }
    A[i + 1] 和 A[r] 交換
    return i + 1
}
僞代碼分析:

調用方法: 排序(數組A,0, 數組A.length - 1)
排序方法非常明確,p,r各表示數組的前後兩端的下標。q表示拆分數組的點,根據這個點將數組拆分成兩個,左邊小於等於基準點,右邊大於基準點。
我們重點分析排序子方法(A, p, r) 這個方法實現了排序,並返回了拆分點。
首先,我們始終取數組最後一個元素爲基準點,x。
遍歷數組A的除x之外的所有元素,與x進行比較。如果元素小於或等於x,i加1, 互換i和j的元素。
這裏爲什麼是和i互換元素呢:
7, 9, 11, 3, 8
首先i初始被定義爲-1,
j = 0 ; 7 <= 8 ; i = 0 ; 0和0互換,相當於沒換
j = 1 ; 9 > 8 ; 不走if裏面的內容,i 還是等於 0
j = 2 ; 11 > 8; 不走if裏面的內容,i 還是等於 0
j = 3 ; 3 <=8 ; i = 1 ;3和1互換 數組爲:7, 3, 11, 9, 8
最後,我們在循環外,還進行了一次互換,i + 1 和 r 互換,這個互換是因爲,我們將r最爲基準點來比較,r的位置一直是沒有變化的,我們將小於r的放在左邊,大於r的放在右邊,最後,我們需要把r放在合適的位置,才能達到這個效果:
i = 1 ; r = 4
根據上面數組的互換,我們已經保證了 0 ~ i 的數據是比8小的,所以,我們通過 i+1和r互換,得到想要的效果。

之後就是遞歸調用,直到排序完成。

Java代碼:
public static void main(String[] args) {
    int[] sortInt = {7, 9, 11, 3, 4, 5, 10, 8};
    quickSort(sortInt, 0, sortInt.length - 1);
}
public static void quickSort(int[] array, int start, int end) {
    if (start < end) {
        int q = partition(array, start, end);
        quickSort(array, start, q - 1);
        quickSort(array, q + 1, end);
    }
    printArray(array);
}

private static int partition(int[] array, int start, int end) {
    int x = array[end];
    int i = start - 1;
    for (int j = start; j < end; j ++) {
        if (array[j] <= x) {
            i = i + 1;
            int temp = array[i]; array[i] = array[j]; array[j] = temp;
        }
    }
    int temp = array[i + 1]; array[i + 1] = array[end]; array[end] = temp;
    return i + 1;
}

[1] 僞代碼摘自 《算法導論》 機械工業出版社
[2] 介紹摘自 百度百科對於快速排序的定義 https://baike.baidu.com/item/快速排序算法/369842?fromtitle=快速排序&fromid=2084344&fr=aladdin

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章