Skip to content

Commit 07aab34

Browse files
authored
添加冒泡排序和选择排序
1 parent 14a9bdb commit 07aab34

1 file changed

Lines changed: 108 additions & 0 deletions

File tree

notes/algorithms/基础排序算法.md

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,116 @@
77

88
#### 1. 冒泡排序
99

10+
> 思路:每一趟遍历将最大元素冒泡到数组最后的位置;
11+
12+
```
13+
public class BubbleSort {
14+
15+
// 方式;
16+
public static void sort(int[] arr) {
17+
int n = arr.length;
18+
boolean swapped = false;
19+
20+
do {
21+
swapped = false;
22+
for (int i = 1; i < n; i++) {
23+
if (arr[i - 1] > arr[i]) {
24+
swap(arr, i - 1, i);
25+
swapped = true;
26+
}
27+
}
28+
} while(swapped);
29+
}
30+
31+
// 方式2
32+
public static void sort2(int[] arr) {
33+
int n = arr.length;
34+
35+
if (n <= 1) {
36+
return;
37+
}
38+
39+
// 使用newn来进行优化
40+
int newn;
41+
42+
do {
43+
newn = 0;
44+
for (int i = 1; i < n; i++) {
45+
if (arr[i - 1] > arr[i]) {
46+
swap(arr, i - 1, i);
47+
// 记录当前排序最后一次交换的位置,在此之后的元素在下一轮扫描中均不考虑
48+
newn = i;
49+
}
50+
}
51+
n = newn;
52+
} while (newn > 0);
53+
54+
}
55+
56+
// 方式3
57+
public static void sort3(int[] arr) {
58+
int n = arr.length;
59+
if (n <= 1) {
60+
return;
61+
}
62+
63+
for (int i = 0; i < n; i++) {
64+
boolean flag = false;
65+
66+
// n - i - 1 表示每轮排序都会有一个最大元素冒泡到最大位置,因而每轮排序都会少一个遍历的元素
67+
for (int j = 0; j < n - i - 1; j++) {
68+
if (arr[j] < arr[j + 1]) {
69+
swap(arr, j, j + 1);
70+
flag = true;
71+
}
72+
}
73+
// 此轮排序没有数据交换,则退出排序
74+
if (!flag) {
75+
break;
76+
}
77+
}
78+
}
79+
80+
public static void swap(int[] arr, int i, int j) {
81+
int tmp = arr[i];
82+
arr[i] = arr[j];
83+
arr[j] = tmp;
84+
}
85+
}
86+
```
87+
88+
> 分析:对于方式一,由于每一趟排序都会将最大元素冒泡到最后一位,所以下一次排序就不用考虑最后一个位置的元素了,从而加速下一次排序的速度。代码中的方式2和方式3都是同样的优化思路。
89+
1090
#### 2. 选择排序
1191

92+
思路:依次寻找[i, n)区间里的最小值的索引。
93+
94+
```
95+
public class SelectionSort {
96+
97+
public static void sort(int[] arr) {
98+
99+
int n = arr.length;
100+
101+
for (int i = 0; i < n; i++) {
102+
int min = i;
103+
for (int j = i+1; i < n; i++) {
104+
if (arr[j] < arr[min]) {
105+
min = j;
106+
}
107+
}
108+
swap(arr, i, min);
109+
}
110+
}
111+
112+
public static void swap(int[] arr, int i, int j) {
113+
int tmp = arr[i];
114+
arr[i] = arr[j];
115+
arr[j] = tmp;
116+
}
117+
}
118+
```
119+
12120
#### 3. 插入排序
13121

14122
#### 4. 归并排序

0 commit comments

Comments
 (0)