Java 冒泡排序算法(詳細過程講解並附實現代碼)

前言

冒泡排序算法是由左向右,按順序對兩個數據比大小(如果是想數據由小到大排列),前一個比後一個大,那麼就交換一下位置。每循環一輪,都會將該輪循環所遇到的最大的數排到最後面。假設數組長度是length,那麼只要循環length - 1輪就可以把該數組按照由小到大排列好了。

冒泡排序過程

假設一個數組 int[ ] arr = new int[ ]{3,4,1,2,0};

第一輪遍歷:

交換前:

3 4 1 2 0

交換後:(由於3 < 4所以位置不交換)

3 4 1 2 0

交換前:

3 4 1 2 0

交換後:(由於1 < 4所以位置交換)

3 1 4 2 0

交換前:

3 1 4 2 0

交換後:(由於2 < 4所以位置交換)

3 1 2 4 0

交換前:

3 1 2 4 0

交換後:(由於0 < 4所以位置交換)

3 1 2 0 4

第一輪交換結束,該輪遇到的最大的數字4,已經排在最後面,並且4是此數組中最大的數,因爲該次遍歷完了所有數據

第二輪遍歷:

交換前:

3 1 2 0 4

交換後:(由於1 < 3所以位置交換)

1 3 2 0 4

交換前:

1 3 2 0 4

交換後:(由於2 < 3所以位置交換)

1 2 3 0 4

交換前:

1 2 3 0 4

交換後:(由於0 < 3所以位置交換)

1 2 0 3 4

由於4已經是最大的數字了,所以此處並不需要進行第4次交換。同時第二次遍歷數組會找出第二大的數,並將其排在了倒數第二的位置。

第三輪遍歷

交換前:

1 2 0 3 4

交換後:(由於1 < 2所以位置不交換)

1 2 0 3 4

交換前:

1 2 0 3 4

交換後:(由於0 < 2所以位置交換)

1 0 2 3 4

由於3是該輪第二大的數字,所以此處不需要進行第3輪交換,並且第三輪遍歷會找出該數組第三大的數,將其放在了倒三的位置。

第四輪遍歷

交換前:

1 0 2 3 4

交換後:(由於0 < 1所以位置交換)

0 1 2 3 4

由於2是該數組第三大的數字,所以此處不需要第2輪交換。至此,冒泡排序結束,最終數組已經排序完成,並且是由小到大排序。

規律總結

該數組的長度是 5
一共進行了4輪遍歷
第一輪遍歷:4次交換次數
第二輪遍歷:3次交換次數
第三輪遍歷:2次交換次數
第四輪遍歷:1次交換次數
排序結束。

該規律可以等價爲:
數組長度爲:length
①則需要進行:length - 1輪遍歷
換成for循環爲:(i = 0,1,2,…,length - 2),共循環length - 1次

for(int i = 0;i < length - 1;i++){
}

②第 i 輪遍歷所需的交換次數爲:length - 1 - i;(i 的初始值爲0)
換成for循環爲:(j = 0,1,2,…,length - 2 - i)

for(int j = 0;j < length - 1 - i;j++){
}

由於②的循環次數受①影響,所以②循環應該嵌套在①內,具體實現代碼如下:

示例代碼

public class BubbleSort {
	public static void main(String[] args) {
		int[] arr = new int[] {12,2,84,65,-51,57,85,11,54,-12};
		
		int temp = 0;
		
		for(int i = 0;i < arr.length - 1;i++) {//數組遍歷次數
			
			for(int j = 0;j < arr.length - 1 - i;j++) {//第i次遍歷的交換次數
				if(arr[j] > arr[j + 1]) {
					temp = arr[j];
					arr[j] = arr[j + 1];
					arr[j + 1] = temp;
				}
			}
		}
		//將數組輸出
		for(int i = 0;i < arr.length;i++) {
			System.out.print(arr[i] + " ");
		}
	}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章