冒泡排序
需求
将无序数组通过方法变成有序数组
示例
[5, 1, 2, 8, 3, 9, 10, 6, 4, 7]
-------------------------------
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
1
2
3
2
3
思路
依次比较数组中相邻两个元素大小,若a[j]>a[j+1],则交换两个元素,两两都比较一遍称为一轮冒泡,结果是让最大的元素排至最后,最小的元素排至最前,重复这个步骤,直至数组有序。
优化方式
在一轮冒泡中,若没有发生交换,则说明当前索引停留的位置以后的元素已有序,所以每轮冒泡结束可以将最后一次交换的索引作为下一次冒泡的比较次数,如果这个值为0,表示整个数组有序,直接退出外层循环即可。
前面的元素比后面的元素大就交换位置,反复交换,直至大的在数组后面,小的在数组前面,以此达到数组有序
代码
public static void bubble(int[] arr) {
int n = arr.length - 1;
while (true) {
int last = 0;//记录最后一次交换位置的下标
for (int i = 0; i < n; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
last = i;
}
}
n = last;//缩小遍历范围,减少比较次数
//当最后一次交换的下标在0索引时,代表没有发生交换
if (n == 0) {
break;//结束循环
}
}
}
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
上次更新: 2023/12/29 11:32:56