基本思想
冒泡排序的基本思想是,进行(最多进行)n-1趟冒泡,其中n为数据的个数,其中每次冒泡会将未排序的最大的值移动到未排序序列的末尾,冒泡的方式是从左到有依次两两比较,并将值较大的交换到右侧,将值较小的移动到左侧。这样每趟冒泡都会将一个最大值(未排序的部分)放到正确的位置上。
演练
原始数组:3, 9, -1, 10, 20
第一趟排序 (1) 3, 9, -1, 10, 20 // 如果相邻的元素逆序就交换 (2) 3, -1, 9, 10, 20 (3) 3, -1, 9, 10, 20 (4) 3, -1, 9, 10, 20
第二趟排序 (1) -1, 3, 9, 10, 20 //交换 (2) -1, 3, 9, 10, 20 (3) -1, 3, 9, 10, 20
第三趟排序 (1) -1, 3, 9, 10, 20 (2) -1, 3, 9, 10, 20
第四趟排序 (1) -1, 3, 9, 10, 20
小结冒泡排序规则 (1) 一共进行 数组的大小-1 次 大的循环 (2) 每一趟排序的次数在逐渐的减少 (3) 如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化
代码实现
public class BubbleSort {
public static void main(String[] args) {
Integer[] arr = new Integer[]{1, 31, 24, 2, 34, 231, 231, 23, 1, 3, 424, 2, 34, 2, 4, 2, 42, 34, 23, 42, 4, 23};
// arr.length - 1 当只剩下一个了 说明不需要在遍历了 所以遍历的次数是整个数组长度 -1
for (int i = 0; i < arr.length - 1; i++) {
// 每经过一次冒泡最大值就会在数组的最右边 所以每次遍历的次数需要减去大循环的 i
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
Integer integer = arr[i];
System.out.print(integer + " ");
}
}
}
优化后代码
public class BubbleSort {
public static void main(String[] args) {
Integer[] arr = new Integer[]{3, 9, -1, 10, 20};
// 优化
boolean flag = false;
// arr.length - 1 当只剩下一个了 说明不需要在遍历了 所以遍历的次数是整个数组长度 -1
for (int i = 0; i < arr.length - 1; i++) {
// 每经过一次冒泡最大值就会在数组的最右边 所以每次遍历的次数需要减去大循环的 i
for (int j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
flag = true;
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
if (!flag){
break;
} else {
flag = false;
}
}
for (int i = 0; i < arr.length; i++) {
Integer integer = arr[i];
System.out.print(integer + " ");
}
}
}