4
4
5
5
定义一个布尔变量 ` hasChange ` ,用来标记每轮是否进行了交换。在每轮遍历开始时,将 ` hasChange ` 设置为 false。
6
6
7
+ 若当轮没有发生交换,说明此时数组已经按照升序排列,` hashChange ` 依然是为 false。此时外层循环直接退出,排序结束。
8
+
7
9
### 代码示例
8
10
9
11
``` java
10
12
import java.util.Arrays ;
11
13
12
14
public class BubbleSort {
13
- private static void swap (int [] nums , int i , int j ) {
14
- int t = nums[i];
15
- nums[i] = nums[j];
16
- nums[j] = t;
17
- }
18
15
19
16
private static void bubbleSort (int [] nums ) {
20
17
boolean hasChange = true ;
21
- for (int i = 0 ; i < nums. length - 1 && hasChange; ++ i) {
18
+ for (int i = 0 , n = nums. length; i < n - 1 && hasChange; ++ i) {
22
19
hasChange = false ;
23
- for (int j = 0 ; j < nums . length - 1 - i ; ++ j) {
20
+ for (int j = 0 ; j < n - i - 1 ; ++ j) {
24
21
if (nums[j] > nums[j + 1 ]) {
25
22
swap(nums, j, j + 1 );
26
23
hasChange = true ;
@@ -29,6 +26,12 @@ public class BubbleSort {
29
26
}
30
27
}
31
28
29
+ private static void swap (int [] nums , int i , int j ) {
30
+ int t = nums[i];
31
+ nums[i] = nums[j];
32
+ nums[j] = t;
33
+ }
34
+
32
35
public static void main (String [] args ) {
33
36
int [] nums = {1 , 2 , 7 , 9 , 5 , 8 };
34
37
bubbleSort(nums);
@@ -39,15 +42,15 @@ public class BubbleSort {
39
42
40
43
### 算法分析
41
44
42
- 空间复杂度 O(1)、时间复杂度 O(n^2 )。
45
+ 空间复杂度 O(1)、时间复杂度 O(n² )。
43
46
44
47
分情况讨论:
45
48
46
49
1 . 给定的数组按照顺序已经排好:只需要进行 ` n-1 ` 次比较,两两交换次数为 0,时间复杂度为 O(n),这是最好的情况。
47
- 2 . 给定的数组按照逆序排列:需要进行 ` n*(n-1)/2 ` 次比较,时间复杂度为 O(n^2 ),这是最坏的情况。
48
- 3 . 给定的数组杂乱无章。在这种情况下,平均时间复杂度 O(n^2 )。
50
+ 2 . 给定的数组按照逆序排列:需要进行 ` n*(n-1)/2 ` 次比较,时间复杂度为 O(n² ),这是最坏的情况。
51
+ 3 . 给定的数组杂乱无章。在这种情况下,平均时间复杂度 O(n² )。
49
52
50
- 因此,时间复杂度是 O(n^2 ),这是一种稳定的排序算法。
53
+ 因此,时间复杂度是 O(n² ),这是一种稳定的排序算法。
51
54
52
55
> 稳定是指,两个相等的数,在排序过后,相对位置保持不变。
53
56
@@ -66,18 +69,19 @@ public class BubbleSort {
66
69
import java.util.Arrays ;
67
70
68
71
public class InsertionSort {
72
+
69
73
private static void insertionSort (int [] nums ) {
70
- for (int i = 1 , j, current ; i < nums . length ; ++ i) {
71
- current = nums[i];
72
- for (j = i - 1 ; j >= 0 && nums[j] > current ; -- j) {
74
+ for (int i = 1 , j, n = nums . length ; i < n ; ++ i) {
75
+ int num = nums[i];
76
+ for (j = i - 1 ; j >= 0 && nums[j] > num ; -- j) {
73
77
nums[j + 1 ] = nums[j];
74
78
}
75
- nums[j + 1 ] = current ;
79
+ nums[j + 1 ] = num ;
76
80
}
77
81
}
78
-
82
+
79
83
public static void main (String [] args ) {
80
- int [] nums = { 1 , 2 , 7 , 9 , 5 , 8 };
84
+ int [] nums = {1 , 2 , 7 , 9 , 5 , 8 };
81
85
insertionSort(nums);
82
86
System . out. println(Arrays . toString(nums));
83
87
}
@@ -86,15 +90,15 @@ public class InsertionSort {
86
90
87
91
### 算法分析
88
92
89
- 空间复杂度 O(1),时间复杂度 O(n^2 )。
93
+ 空间复杂度 O(1),时间复杂度 O(n² )。
90
94
91
95
分情况讨论:
92
96
93
97
1 . 给定的数组按照顺序排好序:只需要进行 n-1 次比较,两两交换次数为 0,时间复杂度为 O(n),这是最好的情况。
94
- 2 . 给定的数组按照逆序排列:需要进行 ` n*(n-1)/2 ` 次比较,时间复杂度为 O(n^2 ),这是最坏的情况。
95
- 3 . 给定的数组杂乱无章:在这种情况下,平均时间复杂度是 O(n^2 )。
98
+ 2 . 给定的数组按照逆序排列:需要进行 ` n*(n-1)/2 ` 次比较,时间复杂度为 O(n² ),这是最坏的情况。
99
+ 3 . 给定的数组杂乱无章:在这种情况下,平均时间复杂度是 O(n² )。
96
100
97
- 因此,时间复杂度是 O(n^2 ),这也是一种稳定的排序算法。
101
+ 因此,时间复杂度是 O(n² ),这也是一种稳定的排序算法。
98
102
99
103
## 归并排序
100
104
0 commit comments