1 什么是冒泡排序
首先,我们拿到的是一个无序数组,然后,越小的元素会经过交换慢慢的 “ 浮 ” 到数列的顶端(升序或降序),就像水中的小鱼吐出的气泡最终会浮到顶端,浮出水面一样,所以叫做 “ 冒泡排序 ”。
2 怎么冒泡排序
1、思路
(1) 首先,确定从左到右是升序还是降序;
(2) 比较相邻的两个元素,是否符合升序降序的要求,符合则接着比较后面相邻的元素,不符合则交换两个元素;
(3) 对每一对元素重复上一项工作,直到排完。
2、具体实施(结合代码)
(1) 给定一个无序的数组;
int[] arr = {9,5,2,7,3,6};
bubbleSort(arr);
System.out.println(arr);
(2) 我们要构建两个循环,一个里循环一个外循环,外循环控制第几轮的循环,内层控制当前一轮循环中两个数之间的交换。我们升序排列,所以就是越大越往右边放,小的数就会像气泡一样 " 浮 "到最左端;
// 外层循环,控制轮数
for (int bound = 0; bound <arr.length-1; bound++) {
//里层循环,比较交换
for (int cur = 0; cur < arr.length-1-bound; cur++) {
if(arr[cur] > arr[cur + 1]){
//不符合排序要求
int tmp = arr[cur];
arr[cur] = arr[cur + 1];
arr[cur + 1] = tmp;
}
}
}
红色下划线标注的是交换的当前循环正在比较交换的两个数,越大越往右边移动;
我们发现其实第三轮就已经排好了,但计算机会接着循环判断,因为计算机不能像人这样看到并且判断,不过每次循环到语句 if(arr[cur] > arr[cur + 1]) 时不符合条件就不会再交换了。
注意 bound < arr.length - 1 ,首先它从 0 开始,所以要 < arr.length 而不是 <= ,然后因为循环到最后一次时,只剩一个数没有必要再进循环中比较,所以再 - 1 。
注意 cur < arr.length - 1 - bound ,它 < arr.length 和 - 1 的原因同上, - bound 是因为,排序排到第几轮,就会有几个数已经到了它应在的位置,如例子中,排完第二次时,7 和 9 已经到了应到的位置。
3 完整代码
int[] arr = {9,5,2,7,3,6};
bubbleSort(arr);
System.out.println(Arrays.toString(arr));
public static void bubbleSort(int[] arr) {
//从前往后遍历
//外层循环遍历的次数
//已排区间[0,bound)
//待排区间[bound,length)
for (int bound = 0; bound <arr.length-1; bound++) {
//里层循环,比较交换
for (int cur = 0; cur < arr.length-1-bound; cur++) {
if(arr[cur] > arr[cur + 1]){
//不符合排序要求
int tmp = arr[cur];
arr[cur] = arr[cur + 1];
arr[cur + 1] = tmp;
}
}
}
}