問題
冒泡排序(Bubble Sort),是一種比較簡單的排序算法。在冒泡排序算法中,需要重複的走訪要排序的數列,一次比較兩個元素,如果它們的大小順序錯誤就把它們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換的元素,也就是說該數列已經排序完成。由于在排序過程中總是小數往前放,大數往後放,相當于氣泡往上升,是以稱作冒泡排序。
本案例要求使用冒泡排序算法實作對數組的排序。有一個長度為10的整型數組,使用冒泡排序算法将數組按照升序排列,并輸出排序的過程以及結果。程式互動情況如圖所示:

方案
為了了解冒泡排序算法,我們先假設有一個長度為7的數組,數組内容如圖所示:
上圖中的數組元素為無序狀态,為實作升序排列,可以先進行第一輪比較,過程大緻如下:
1.先比較第一對相鄰的元素(第一個位置的89和第二個位置的50):如果第一個比第二個大,就交換兩個數值;
2.繼續比較第二對相鄰的元素(第二個位置和第三個位置):如果第二個位置上的數值大于第三個位置上的數值,則交換;
3.繼續下去,重複上述的比較工作,直到結尾的最後一對;此時,一輪比較交換完成後,最後的元素則是數列中最大的數。
第一輪比較的過程如圖所示:
由上圖可以看出,第一輪比較後,已經将數組中的最大值通過位置交換,移動到數組的最後位置上。但是,其餘的元素依然為無序狀态,是以,依然進行第二輪比較:針對除最後一個元素外的其他元素重複以上步驟,以找到剩餘元素中的最大數,且放置到倒數第二的位置上。第二輪比較的過程如圖所示:
由上圖可以看出,第一個位置上的50比第二個位置上的84小,是以不發生交換;而其他位置将依次發生變換,進而将84交換到倒數第二的位置上。
然後,繼續進行其他輪比較,持續進行,每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較,則排序完成。整個排序的過程如圖所示:
由上圖可以看出,實作冒泡排序算法時,需要使用嵌套的兩個循環來實作:外層循環用于控制排序的輪次,裡層循環用于控制每輪排序中的兩兩互動。
步驟
實作此案例需要按照如下步驟進行。
步驟一:定義類及main方法
首先定義一個名為BubbleSort的類,并在類中添加Java應用程式的主方法main,代碼如下所示:
public class BubbleSort{
public static void main(String[] args){
}
}
步驟二:建立數組
在main方法中建立一個長度為10的數組,并使用for語句建構一個10次的循環,在每次循環中,随機産生一個0到99之間的整數,并存入數組,然後,列印數組的内容顯示在界面上。
此案例中,使用Random類的nextInt()方法産生随機數。代碼如下所示:
import java.util.Random;
import java.util.Arrays;
public class BubbleSort{
public static void main(String[] args){
//建立數組
int[] arr=new int[10];
Random ran=new Random();
for(int i=0;i<arr.length;i++){
arr[i]=ran.nextInt(100);
}
System.out.println(Arrays.toString(arr));
}
}
注意:此步驟中,需要導入java.util包下的Random類和Arrays類。
步驟三:排序
使用冒泡排序算法對數組進行排序:每一輪比較中,兩兩相比,找到更大的數值移動到最後,直到都比較過一遍。為便于檢視排序的過程,将每輪比較後的數組内容輸出顯示,并将最後的結果輸出到控制台。代碼如下所示:
import java.util.Random;
import java.util.Arrays;
public class BubbleSort{
public static void main(String[] args){
//建立數組
int[] arr=new int[10];
Random ran=new Random();
for(int i=0;i<arr.length;i++){
arr[i]=ran.nextInt(100);
}
System.out.println(Arrays.toString(arr));
//冒泡排序
System.out.println("----------冒泡排序 開始----------");
}
}