在操作數組時,經常需要對數組中的元素進行排序。接下來介紹一種非常常見的排序算法--冒泡排序。
在冒泡排序的過程中,不斷地比較數組中相鄰的元素,較小者向上浮,較大者向下沉,整個過程和水中氣泡上升的原理相似,故稱之為冒泡排序。
原理
第一步,從第一個元素開始,將相鄰的兩個元素進行比較,直到最后兩個元素完成比較。如果前面的元素比后面的元素大,則交換它們的位置。整個過程完成后,數組中最后一個元素自然就是最大值,這樣也就完成了第一趟的比較。
第二步,除了最后一個元素,將剩余的元素按照第一步的方法進行兩兩比較,這樣就可以將數組中第二大的元素放到倒數第二個位置上。
第三步,以此類推,持續對越來越少的元素重復上面的步驟,直到沒有任何一對元素需要比較為止。
總體而言,在冒泡排序中,程序的時間復雜度和空間復雜度隨着程序的執行,均呈現遞減趨勢。
代碼
public class Example32{
public static void main(String[] args){
int[] arr={9, 8, 3, 5, 2};
System.out.print("冒泡排序前:");
printArray(arr); // 打印排序前的數組元素
bubbleSort(arr); // 調用排序方法
System.out.print("冒泡排序后:");
printArray(arr); // 打印排序后的數組元素
}
// 定義打印數組方法
public static void printArray(int[] arr){
for(int i=0; i<arr.length; i++){ // 從第一個數組元素開始遍歷數組元素
System.out.print(arr[i]+" "); // 輸出數組元素,並加空格以控制格式
}
System.out.print("\n"); // 完成一次調用后換行
}
// 定義冒泡排序方法
public static void bubbleSort(int[] arr){
for(int i=0; i<arr.length -1; i++){ // 外層循環,控制總共需要比較的趟數
for(int j=0; j<arr.length -i -1; j++){ // 內層循環,控制每趟需要比較的次數
if(arr[j] > arr[j+1]){ // 比較相鄰元素
// 以下三行代碼用於交換兩個元素
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
System.out.print("第"+(i+1)+"輪排序后:"); // 每趟執行完后,輸出提示信息
printArray(arr); // 輸出本趟執行后的結果
}
}
}
結果
分析
bubbleSort()方法通過一個嵌套for循環實現了冒泡排序。
其中外層循環用來控制比較的趟數,即【數組元素的個數-1】,每一趟比較,都可以確定一個元素的位置,由於最后一個元素不需要比較,因此外層循環的次數為【arr.length-1】。
內層循環用於控制每趟比較的次數,由於變量i在循環的過程中是自增的,因此程序每執行一趟,每次比較的次數遞減。
每次比較的過程中,如果前者小於后者,則交換兩個元素的位置。
在第一輪比較中,第一個元素【9】為最大值,因此它在每次比較時都會發生位置的交換,直到被放到最后一個位置。第二輪比較中,元素【8】為第二大值,比較過程和第一輪比較類似,直到被放到倒數第二個位置。循環第三輪和第四輪比較,第四輪比較完成后,數組元素已經完成了排序。
其交換過程,類似於A杯子裝了可樂,B杯子裝了雪碧,現在需要把A杯子的可樂和B杯子的雪碧互換,因此需要拿出C杯子(即臨時變量temp)。把B杯子的雪碧倒入C杯子,此時B杯子為空杯;把A杯子的可樂倒入B杯子,此時A杯子為空杯;再將C杯子的雪碧倒入A杯子;此時C杯子為空杯,A杯子為雪碧,B杯子為可樂,即完成了可樂和雪碧的互換。
圖例
引用
參考項 | 地址 |
---|---|
文中GIF圖片引用 | https://blog.csdn.net/hcz666/article/details/117810787 |
<- 完 ->