算法學習——遞歸之快速排序
阿新 • • 發佈:2018-11-17
算法思路 () 留下 結果 思路 while 兩個 amp 算法學習
算法描述
快速排序
算法思路
快速排序算法的基本思路為從數組中選擇一個數為基準數,之後,將比基準數小的數放在左邊,比基準數大的數放在右邊(分為了兩個區),之後將左邊(小於基準數)與右邊(大於基準數)再次進行上述操作,一直重復直到無法再分為止
用戶輸入n,使用隨機數產生n個數放入到數組a中
調用遞歸方法
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; }
結果
算法學習——遞歸之快速排序