Bubble Sort
氣泡排序的重點:
陣列中,二個值比較,大的放後面。
第一輪
比5次。
- 6,5先比較,6比5大,放後面。
- 6,4比較,6比4大,放後面。
- 6,3比較,6比3大,放後面。
- 6,2比較,6比2大,放後面。
- 6,1比較,6比1大,放後面。
交換的方式如下圖。
- 準備一個暫存變數temp。
- 6放在temp。
- 5放在6的位置。
- temp放在5的位置。
把以上的描述用程式寫死。
- 比5次。
- 都跟後面1個比,後面比較小進入下個步驟。
- 跟後面的值交換。
1
2
3
4
5
6
7
8
9
10
11
12
13
// 6, 5, 4, 3, 2, 1
int[] arr = {6, 5, 4, 3, 2, 1};
// 比5次
for (int j = 0; j < 5; j++) {
// 2. 都跟後面1個比,後面比較小進入下個步驟。
if (arr[j] > arr[j + 1]) {
// 3. 跟後面的值交換。
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
[5, 4, 3, 2, 1, 6]
第2輪
比4次。
- 5,4先比較,5比4大,放後面。
- 5,3比較,5比3大,放後面。
- 5,2比較,5比2大,放後面。
- 5,1比較,5比1大,放後面。
1
2
3
4
5
6
7
8
9
10
for (int j = 0; j < 4; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
[4, 3, 2, 1, 5, 6]
第3輪
比3次。
- 4,3比較,4比3大,放後面。
- 4,2比較,4比2大,放後面。
- 4,1比較,4比1大,放後面。
比3次
1
2
3
4
5
6
7
8
9
10
11
// 比3次
for (int j = 0; j < 3; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
[3, 2, 1, 4, 5, 6]
第4輪
比2次。
- 3,2比較,3比2大,放後面。
- 3,1比較,3比1大,放後面。
1
2
3
4
5
6
7
8
9
10
11
// 比2次
for (int j = 0; j < 2; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
[2, 1, 3, 4, 5, 6]
第5輪
比1次。
- 2,1比較,2比1大,放後面。
1
2
3
4
5
6
7
8
9
10
11
// 比1次
for (int j = 0; j < 1; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
[1, 2, 3, 4, 5, 6]
重覆的程式碼
以下會出現5次內容一模一樣的程式碼,只有j < ?
是有變化的,其它都沒有變化。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
public class Test {
public static void main(String[] args) {
int[] arr = {6, 5, 4, 3, 2, 1};
// 比5次
for (int j = 0; j < 5; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
// 比4次
for (int j = 0; j < 4; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
// 比3次
for (int j = 0; j < 3; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
// 比2次
for (int j = 0; j < 2; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
// 比1次
for (int j = 0; j < 1; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
重覆5次的程式碼,一模一樣的程式碼,就由迴圈來省略重覆的程式碼。
j < ?
的變化是由5, 4, 3, 2, 1,由大到小遞減。
所以外層迴圈要用由大到小,5 -> 4 -> 3 -> 2 -> 1。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Test {
public static void main(String[] args) {
// 6, 5, 4, 3, 2, 1
int[] arr = {6, 5, 4, 3, 2, 1};
// loop_count迴圈次數 5 -> 4 -> 3 -> 2 -> 1
int loop_count = 5;
for (int i = loop_count; i > 0; i--) {
for (int j = 0; j < i; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
}
[5, 4, 3, 2, 1, 6]
[4, 3, 2, 1, 5, 6]
[3, 2, 1, 4, 5, 6]
[2, 1, 3, 4, 5, 6]
[1, 2, 3, 4, 5, 6]
外層迴圈的作用是執行5次,所以下面的程式碼可以確保外層迴圈執行5次。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Test {
public static void main(String[] args) {
// 6, 5, 4, 3, 2, 1
int[] arr = {6, 5, 4, 3, 2, 1};
// loop_count迴圈次數 5 -> 4 -> 3 -> 2 -> 1
int loop_count = 5;
for (int i = 0; i < loop_count; i++) {
for (int j = 0; j < loop_count - i ; j++) {
// 2. 都跟後面1個比。
if (arr[j] > arr[j + 1]) {
// 3. 比較大的,放後面
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.println(Arrays.toString(arr));
}
}
}
外層迴圈次數是陣列大小 - 1。
1
int loop_count = arr.length - 1;;