從這篇往後的文章,我都是向一名HackMD上的一位作者Aquamay學習,演算法的領域很大很廣很深,如果對於內容有任何問題或是好奇的,也都歡迎去參考他的文章內容,講的都非常淺顯易懂。
程式範例試做:
public class Alex1007_1 {
public static void main(String[] args) {
int arr[] = {9,3,6,8,2,4,5};
System.out.println("原陣列: "+Arrays.toString(arr));
int temp = 0;
for(int j = 0; j < arr.length -1; j++) {
for(int i = 0; i < arr.length - 1 - j; i++) {
if(arr[i] > arr[i+1]) {
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
System.out.println("第 "+(j+1)+" 輪排序: "+Arrays.toString(arr));
}
}
}
程式執行結果:
原陣列: [9, 3, 6, 8, 2, 4, 5]
第 1 輪排序: [3, 6, 8, 2, 4, 5, 9]
第 2 輪排序: [3, 6, 2, 4, 5, 8, 9]
第 3 輪排序: [3, 2, 4, 5, 6, 8, 9]
第 4 輪排序: [2, 3, 4, 5, 6, 8, 9]
第 5 輪排序: [2, 3, 4, 5, 6, 8, 9]
第 6 輪排序: [2, 3, 4, 5, 6, 8, 9]
不過由於我們非常容易就發現,第四行之後執行的結果是完全一模一樣,所以將程式碼做以下修改。
程式範例試做:
public class Alex1007_2 {
public static void main(String[] args) {
int arr[] = {9,3,6,8,2,4,5};
System.out.println("原陣列: "+Arrays.toString(arr));
int temp = 0;
boolean flag = flse;
for(int j = 0; j < arr.length -1; j++) {
for(int i = 0; i < arr.length - 1 - j; i++) {
if(arr[i] > arr[i+1]) {
flag = true;
temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
}
}
if(!flag) { //在一輪排序中一次交換都沒有發生過
break;
} else {
flag = false; //重置flag進行下一輪排序
}
System.out.println("第 "+(j+1)+" 輪排序: "+Arrays.toString(arr));
}
程式執行結果:
原陣列: [9, 3, 6, 8, 2, 4, 5]
第 1 輪排序: [3, 6, 8, 2, 4, 5, 9]
第 2 輪排序: [3, 6, 2, 4, 5, 8, 9]
第 3 輪排序: [3, 2, 4, 5, 6, 8, 9]
第 4 輪排序: [2, 3, 4, 5, 6, 8, 9]