快速排序快速入門

大牛帶帶我發表於2018-08-05

快速排序

快速排序的基本思想:

1.選一個數作為基準數(一般選取區間的第1個數)
2.把所有比這個大的數放到右邊,所有比這個數小的數放到左邊
3.以基準數為分界線,分為左右兩個區間,重複1和2過程,直到區間的個數只有一個


下面我們就用例項來說明:

我們需要有三個引數,i是區間的開始,j是區間的結束,temp是基準數

第一步:i=0,j=7,temp=12
這裡寫圖片描述

第二步:j往前找,找到第一個比temp小的數就停下來,並且和i的值進行交換
在這裡找到比temp小的第一個數就是a[ 5],此時i=0,j=5,temp=12
進行交換

這裡寫圖片描述

第三步:i往後找,找到第一個比temp大的數就停下來,並且和j的值進行交換
在這裡找到比temp大的第一個數就是a[ 3],此時i=3,j=5,temp=12
進行交換

這裡寫圖片描述

第四步:j繼續往前找,一直找到i=j都沒有找到比temp小的數,則停止尋找,第一輪比較結束。此時,所有比temp小的數都在左邊,比temp大的數都在右邊了。此時,i=j=3,temp=12。

第五步:以3這個索引為分界線,分為[0,2]和[4,7]兩個區間,並且一直重複上述步驟,直到子區間只有一個數,不能在分割,下面不再詳細說步驟了。

下面就是快速排序的java程式碼:

public class FastAlgorithm {


    public void sort(int[] arr,int start,int end) {
            //標記第一個位置
            int i = start;
            //標記最後一個的位置
            int j = end;
            //標記基準數
            int first = arr[start];
            while(i<j) {
                //j從右往左遞減,和first作比較
                while(j>i && arr[j]>first) {
                    j--;
                }
                //找到第一個比first小的,交換兩個數
                if(arr[j]<=first) {
                    swap(arr,i,j);
                    i++;
                }

                //從左往右遞增,和first比較
                while(i<j && arr[i]<first) {
                    i++;
                }
                //找到第一個比first大的,交換兩個數
                if(arr[i]>=first) {
                    swap(arr,i,j);
                    j--;
                }
            }
            //i=j時,跳出迴圈
            //遞迴
            //如果左區間個數不小於一,則遞迴下去
            if(i>start) 
                sort(arr,start,i-1);

            //如果右區間個數不小於一,則遞迴下去
            if(j<end) 
                sort(arr,j+1,end);
    }
    /**
     *  交換陣列中的兩個元素
     * @param arr
     * @param i
     * @param j
     */
    private static void swap(int[] arr,int i,int j) {
        int k;
        k = arr[i];
        arr[i] = arr[j];
        arr[j] = k;
    }

}