算法一:快速排序算法

一、算法概念。java

    快速排序是由東尼·霍爾所發展的一種排序算法。在平均情況下,排序 n 個項目要Ο(n log n)次比較。在最壞情況下則須要Ο(n2)次比較,但這種情況並不常見。事實上,快速排序一般明顯比其餘Ο(n log n) 算法更快,由於它的內部循環(inner loop)能夠在大部分的架構上頗有效率地被實現出來。web

二、算法思想。算法

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

三、實現思路。oop

①以第一個關鍵字 K 1 爲控制字,咱們能夠稱爲 "基準"(pivot),將 [K 1 ,K 2 ,…,K n ] 分紅兩個子區,使左區全部關鍵字小於等於 K 1 ,右區全部關鍵字大於等於 K 1 ,最後控制字居兩個子區中間的適當位置,這個稱爲分區(partition)操做。在子區內數據尚處於無序狀態。 
②把左區做爲一個總體,用①的步驟進行處理,右區進行相同的處理。(即遞歸)
ui

遞歸的最底部情形,是數列的大小是零或一,也就是永遠都已經被排序好了。雖然一直遞歸下去,可是這個算法總會退出,由於在每次的迭代(iteration)中,它至少會把一個元素擺到它最後的位置去。
spa

③重複第①、②步,直到左區處理完畢。code

四、實現代碼。orm


public class QuickSort {

    /**
     * @param n quick sort data
     * @param left 
     * @param right
     */
    static void quicksort(int n[], int left, int right) {
        int dp;
        if (left < right) {
            dp = partition(n, left, right);
            quicksort(n, left, dp - 1);
            quicksort(n, dp + 1, right);
        }
    }

    static int partition(int n[], int left, int right) {
        int pivot = n[left];
        while (left < right) {
            while (left < right && n[right] >= pivot)
                right--;
            if (left < right)
                n[left++] = n[right];
            while (left < right && n[left] <= pivot)
                left++;
            if (left < right)
                n[right--] = n[left];
        }
        n[left] = pivot;
        return left;
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        int n[] = {2, 1, 4, 3, 8, 7, 10, 9, 12};
        quicksort(n, 0, n.length-1);
        for(int i=0; i<n.length; i++){
            System.out.println(n[i]);
        }
    }

}
相關文章
相關標籤/搜索