快速排序(JAVA描述)

設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作爲關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱爲一趟快速排序。值得注意的是,快速排序不是一種穩定的排序算法,也就是說,多個相同的值的相對位置也許會在算法結束時產生變動。
一趟快速排序的算法是:
1)設置兩個變量i、j,排序開始的時候:i=0,j=N-1;
2)以第一個數組元素作爲關鍵數據,賦值給key,即key=A[0];
3)從j開始向前搜索,即由後開始向前搜索(j–),找到第一個小於key的值A[j],將A[j]和A[i]互換;
4)從i開始向後搜索,即由前開始向後搜索(i++),找到第一個大於key的A[i],將A[i]和A[j]互換;
5)重複第3、4步,直到i=j; (3,4步中,沒找到符合條件的值,即3中A[j]不小於key,4中A[i]不大於key的時候改變j、i的值,使得j=j-1,i=i+1,直至找到爲止。找到符合條件的值,進行交換的時候i, j指針位置不變。另外,i==j這一過程一定正好是i+或j-完成的時候,此時令循環結束)。

現象:可比較我的其他算法現象
組建數組元素個數:10000000(千萬)
組件隨機數組運行時間:233ms
排序運行時間:78ms

import java.util.Random;


public class QuitSort {

    public static void show(int [] a){
        for(int i=0;i<a.length;i++){
            System.out.print(a[i]+"、");
        }
        System.out.println();
    }

    public static int[] get_intarr(int len){
        long begin = System.currentTimeMillis();
        Random ran = new Random();
        int [] result = new int[len];
        for(int i=0;i<len;i++){result[i] = ran.nextInt(100); }
        long runtime = System.currentTimeMillis()-begin;
        System.out.println("組建數組元素個數:"+len);
        System.out.println("組件隨機數組運行時間:"+runtime);
        return result;
    }

    /**
     * 將a[begin]放在一個位置,左邊小於a[begin],右邊大於a[begin]
     * @param a 數組
     * @param begin 起始位置[以此爲標準]
     * @param end 結束位置
     */
    public static int adjustArray(int []a,int begin,int end){
        int tmp = a[begin];
        int i=begin,j=end;
        while(i<j){
            //從右至左找到小於tmp的數,然後a[i]=a[j],調換位置
            while(i<j && a[j]>=tmp){
                j--;
            }
            if(a[j]<tmp){
                a[i] = a[j];
                i++;
            }

            //從左至右找到大於tmp的數,然後a[j]=a[i],調換位置
            while(i<j && a[i]<=tmp){
                i++;
            }
            if(a[i]>tmp){
                a[j] = a[i];
                j--;
            }
        }
        a[i]=tmp;

        return i;
    }
    /**
     * 遞歸將begin位置數字放置正確位置,直至begin=last
     * @param a
     * @param begin 
     * @param last 
     */
    public static void quickSort(int []a,int begin,int last){
        if(begin < last){
            int i = adjustArray(a, begin, last);
            adjustArray(a,begin,i-1);
            adjustArray(a, i+1, last);
        }
    }

    public static void main(String[] args) {
        int a[] = get_intarr(10000000);
        long begin = System.currentTimeMillis();
        quickSort(a,0,a.length-1);
        long runtime = System.currentTimeMillis()-begin;
        System.out.println("排序運行時間:"+runtime);
//      show(a);
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章