排序算法之快速排序

前言

快速排序,僅僅聽到這個名字,就覺得它和其他的排序算法非同一般了。的確,快速排序是一個非常效率的排序算法,如果說冒泡排序的時間複雜度爲O(n),那麼快速排序的時間複雜度就是O(logn)。
其實快速排序是對冒泡排序的一種改進。
冒泡排序每次只能交換相鄰的兩個元素,而快速排序是跳躍式的交換,交換距離很大,因此總的比較次數和交換次數少了很多,速度也快了不少。
它的基本思想是:通過一趟排序將要排序的數據分割成獨立的兩部分,其中一部分的所有數據比另一部分的所有數據要小,再按這種方法對這兩部分數據分別進行快速排序,整個排序過程可以用遞歸進行,使整個數據變成有序序列。

原理

這是典型的分治思想。

在待排序的數列中,我們首先要找到一個數字作爲基準數。爲了方便,我們一般選擇第一個數來作爲比較的基準數。接下來我們需要把這個待排序的數列中小於這個基準數的元素移動到待排序序列的左邊,把大於基準數的元素移動到待排序數列的右邊。這個時候,這個數列就相對的有序了;接着把兩個分區的元素再按照上面的方法,對每個分區找出基準數,然後移動,直到每個分區只有一個數爲止,這樣這個數列就變成有序的數列了。

實現

public class QuickSort {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] a = new int[] { 47, 29, 71, 99, 78, 19, 24, 47 };
        quickSort(a, 0, a.length - 1);
        System.out.println(Arrays.toString(a));
    }

    private static void quickSort(int[] a, int begin, int end) {
        //
        int tbegin = begin, tend = end;
        // 將第一個值作爲快排序的分界值
        int pivot = a[begin];
        while (tbegin < tend) {
            // 如果兩個遊標沒有交集,或者後面一直大於或等於分界值就一直向前移動
            while (tbegin < tend && a[tend] >= pivot) {
                --tend;
            }
            a[tbegin] = a[tend];
            // 如果兩個遊標沒有交集,或者前面是小於或等於分界值,就一直向後頭移動
            while (tbegin < tend && a[tbegin] <= pivot) {
                ++tbegin;
            }
            a[tend] = a[tbegin];

        }
        // 將臨界值賦值給遊標的交集的地方
        a[tbegin] = pivot;
        if (begin < tend) {
            // 遞歸排序遊標的左邊
            quickSort(a, begin, tend - 1);
        }
        if (tbegin < end) {
            // 遞歸排序遊標的右邊
            quickSort(a, tbegin + 1, end);
        }

    }

}
[19, 24, 29, 47, 47, 71, 78, 99]

總結

快速排序的實現思想與方法:分治+遞歸。

發佈了65 篇原創文章 · 獲贊 93 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章