迴歸基礎系列-快速排序[JAVA]

快速排序:
基本思想:選擇個基準數(一般是第一個元素或最後一個元素),然後以基準數分開左右邊。
* 左邊全部比基準數小
* 右邊全部比基準數大
* 直到左右指針相等,交換下標爲左右指針相等的數和基準數
* 遞歸重複。

/**
 * 快速排序
 * 
 * @author Ant
 *
 */
public class QuickSort {
    /**
     * 基本思想:選擇個基準數(一般是第一個元素或最後一個元素),然後以基準數分開左右邊。
     * 左邊全部比基準數小
     * 右邊全部比基準數大
     * 直到左右指針相等。交換基準數
     * 遞歸重複。
     * 
     * 不妨假設左右移動指針爲“左右步兵”。他們找到該找的位置後交換。直到相遇。
     * @param a
     * @param left
     * @param right
     */
    public static void quickSort(int a[], int left, int right) {
        //大前提,當left>right,遞歸結束。
        if(left>right)
            return;
        //定義兩移動步兵i,j 。 一個存基準數的key
        int i, j, key;
        i = left;
        j = right;
        key = a[left];//基準數

        //當他們還沒相遇時
        while(i!=j){
            //右步兵要找比基準數要小的數,停下來。否則向左移動。
            while(a[j] >= key && i<j)
                j--;
            //左步兵要找比基準數要大的數,停下來。否則向右移動。
            while(a[i] <= key && i<j)
                i++;

            //當他們都停下來,交換彼此位置
            if(i<j){
                int t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
        }
        //最後他們相遇了。交換相遇位置和基準位置。
        a[left] = a[i];
        a[i] = key;

        //遞歸
        quickSort(a, left, i-1);
        quickSort(a, i+1, right);
    }

    public static void main(String[] args) {
        int a[] = { 11, 38, 24, 10, 3, 5, 18 };
        QuickSort.quickSort(a, 0, a.length - 1);
        for (int i = 0; i < a.length; i++) {
            System.out.println(a[i] + " ");
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章