1. 程式人生 > >算法學習——遞歸之快速排序

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

算法思路 () 留下 結果 思路 while 兩個 amp 算法學習

算法描述

快速排序

算法思路

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

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

  3. 調用遞歸方法sort()

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

算法實現

    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;
}

結果

技術分享圖片

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