算法學習——遞歸之快速排序

算法描述

快速排序算法

算法思路

  1. 快速排序算法的基本思路爲從數組中選擇一個數爲基準數,以後,將比基準數小的數放在左邊,比基準數大的數放在右邊(分爲了兩個區),以後將左邊(小於基準數)與右邊(大於基準數)再次進行上述操做,一直重複直到沒法再分爲止數組

  2. 用戶輸入n,使用隨機數產生n個數放入到數組a中dom

  3. 調用遞歸方法sort()code

PS:下面的數組a是全局變量blog

算法實現

System.out.println("輸入數值個數n:");
    Scanner scanner = new Scanner(System.in );
    int n = scanner.nextInt();
    scanner.close();

    a = new int[n+1];
    //隨機賦值,留下a[0]存放基準數
    for (int i = 1; i < n+1; i++) {
        a[i]= (int) (Math.random()*100);
    }
    //輸出數組a
    for (int i = 1; i < n+1; i++) {
        System.out.print(a[i]+"     ");
    }
    sort(1,n);
    //輸出排序後的數值
    System.out.println("");
    for (int i = 1; i <n+1 ; i++) {
        System.out.print(a[i]+"     ");
    }
}
public static void sort(int m1,int m2){
    int i,j;
    if(m1<m2){
        i=m1;
        j=m2;
        a[0]=a[i];//每次的基準數都是傳入分區的第一個數
        //當i=j,便是完成了該分區的排序
        while (i != j) {
            //從右邊開始掃描,直到不知足條件(也就是發現了一個數小於基準數,放入到左邊的分區)
            while(a[j]>=a[0] && j>i){
                j--;
            }
            if(i<j){
                a[i]=a[j];
                i++;
            }
            //從左邊開始掃描,直到不知足條件(也就是發現了一個數大於基準數,放入到右邊的分區)
            while(a[i]<=a[0] && j>i){
                i++;
            }
            if(i<j){
                a[j]=a[i];
                j--;
            }
        }
        a[i]=a[0];//將以前的基準數賦值給a[i]
        //i已經存放了基準數,因此以i爲分界線分爲兩個區,繼續遞歸
        sort(m1,i-1);
        sort(i+1,m2);
    }
    return;
}

結果

相關文章
相關標籤/搜索