文章目录
原理: 从头到尾, 相邻元素两两比较, 把大的往后挪, 直到把最大的放到最后面, 然后重来, 把倒数第二大的挪到倒数第二位, 不断循环, 直到只剩下两个元素的时候, 把大的挪到最末尾, 排序完成
需要两个for循环, 外层i代表第几轮比较交换, 内层j表示数组元素序号, array[j]和array[j+1]表示相邻的两个元素
i: 根据推断可知, 一次遍历确认一个最大元素, 最多需要array.length次遍历, 而最后一次只有第一个元素需要对比, 其他元素都已经排好了, 所以最后一轮无需比较了, 所以外层只需要到 array.length-1
就可以了
j: 根据推断可知, 首先, j+1表示最后一个元素时, j是 array.length-1 , 所以j的取值最大是 array.length-1 . 然后, 其实每轮遍历里, j+1的最大取值都是array.length-i, 所以j只需要到 array.length-i-1
就可以了
冒泡排序还可以优化, 如果某轮遍历里, 没有发生一次交换, 可以认为顺序已经排好了, 直接中断遍历, 返回数组就可以了
public class BubbleSort {
public static void sort(int[] array) {
for (int i = 0; i < array.length - 1; i++) {
System.out.println("第" + (i + 1) + "轮循环");
print(array);
boolean exchanged = false;
for (int j = 0; j < array.length - 1 - i; j++) {
if (array[j] > array[j + 1]) {
int temp = array[j];
array[j] = array[j + 1];
array[j + 1] = temp;
exchanged = true;
}
print(array);
}
if (!exchanged) {
return;
}
}
}
private static void print(int[] array) {
System.out.println(Arrays.stream(array).boxed().toList());
}
public static void main(String[] args) {
int[] array = {5, 4, 3, 2, 1};
sort(array);
array = new int[]{1, 2, 3, 4, 5};
sort(array);
}
}
第1轮循环
[5, 4, 3, 2, 1]
[4, 5, 3, 2, 1]
[4, 3, 5, 2, 1]
[4, 3, 2, 5, 1]
[4, 3, 2, 1, 5]
第2轮循环
[4, 3, 2, 1, 5]
[3, 4, 2, 1, 5]
[3, 2, 4, 1, 5]
[3, 2, 1, 4, 5]
第3轮循环
[3, 2, 1, 4, 5]
[2, 3, 1, 4, 5]
[2, 1, 3, 4, 5]
第4轮循环
[2, 1, 3, 4, 5]
[1, 2, 3, 4, 5]
第1轮循环
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]