package com.hejiale.arithmetic.sort.bubble;
public class BubbleSort {
static int[] arr = {3, 9, -1, 10, 20, 13, 2, 6, 23, -2, -5, 21};
public static void main(String[] args) {
/*
1. 冒泡排序的思路:
冒泡排序通过元素两两的依次比较,每次会将最大值或最小值交换到数组的最后,也就是说,每一趟排序,都会有一个
元素到达固定位置,这就是冒泡排序的核心
2. 代码实现:
非常简单,我们只需要定义两个for循环
1. 第一个for循环定义的是循环的趟数,五个元素就遍历四趟,依次类推
2. 第二个for循环负责具体的循环操作,但是这里有一个注意事项
注意:
注意for循环每次的判断,应该设置为 j + 1 < arr.length - i
1. 左边:j+1,因为我们每次是a[j]和a[j+1]交换,所以我们要防止j+1越界异常
2. 右边:arr.length - i,因为每一趟排序后,就会得到一个最大值,也就是一个
元素的最终位置已经固定了,所以后面循环的时候,我们就不需要和位置已经固定的
元素进行比较了,因为肯定不会发生交换,以此类推,当循环了两趟后,就有两个元素
的位置固定了,也就不用和后两个元素比较,因此得出arr.length-i
3. 代码优化:
如果,在一趟排序中,一次交换也没有发生,那么我们就可以认为,此时的数组已经有序了,就可以停止循环并输出
数组了
所以我们设置一个标志flag,每趟循环前设置初始值为false,一旦发生交换就设置flag为true,然后每趟循环的
最后我们进行判断,如果flag为false,说明该趟排序没有发生交换,就无需在进行排序了,break跳出外层循环
*/
bubble(arr);
print();
}
//冒泡排序
public static int[] bubble(int[] arr) {
int temp = 0;//临时变量,用于交换
boolean flag = false;//flag为true代表出现交换,为false代表没有交换
for (int i = 0; i < arr.length - 1; i++) {//5个元素,要排序四趟,外层for循环定义的是循环趟数
flag = false;//每趟排序前都要进行flag的重置,否则flag有可能就一直为true,即使已经提前排好序了,也无法变为false从而结束排序
for (int j = 0; j + 1 < arr.length - i; j++) {//内层for循环定义的是具体的排序操作
if (arr[j] >= arr[j + 1]) {//如果有乱序的情况,就交换
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
flag = true;
}
}
if (!flag) { // 如果一趟排序没有出现交换,则退出排序,因为此时,数组已经有序
break;
}
}
return arr;
}
//打印数组
public static void print() {
// 输出排序后的数组
for (int i : arr) {
System.out.print(i + "\t");
}
}
}
6.1-冒泡排序
最新推荐文章于 2022-09-06 15:11:47 发布