动图制作:
算法动画网址:https://visualgo.net/zh/sorting
gif录屏软件:GifCam 下载地址:https://download.csdn.net/download/weixin_43820556/86512977
第1趟排序
从数组下标0开始,不断与相邻的比较与交换,确定最大值9,并移动到了数组最后的位置
第1次排序后: 6 7 3 1 5 2 4 8 9
第2趟排序
从数组下标0开始,不断与相邻的比较与交换,确定最大值8,并移动到了数组最后的位置-1
第2次排序后: 6 3 1 5 2 4 7 8 9
第3趟排序
从数组下标0开始,不断与相邻的比较与交换,确定最大值7,并移动到了数组最后的位置-2
第3次排序后: 3 1 5 2 4 6 7 8 9
第4趟排序
从数组下标0开始,不断与相邻的比较与交换,确定最大值6,并移动到了数组最后的位置-3
第4次排序后: 1 3 2 4 5 6 7 8 9
第5趟排序
从数组下标0开始,不断与相邻的比较与交换,确定最大值5,并移动到了数组最后的位置-4
第5次排序后: 1 2 3 4 5 6 7 8 9
此时数组已经完成了排序。从第6~8趟排序的排序其实可以忽略。
package sort;
public class BubbleSort {
public static void main(String[] args) {
int[] o = {7, 6, 9, 3, 1, 5, 2, 4, 8};
System.out.print("排序前: ");
for (int t : o) {
System.out.print(t);
System.out.print(" ");
}
System.out.println();
// 算法部分
for (int i = 1; i < o.length; i++) {
// flag代表数组是否已经有序,当不发生元素交换时,代表数组有序了
boolean flag = true;
for (int j = 0; j < o.length - i; j++) {
if (o[j] > o[j + 1]) {
int tmp = o[j];
o[j] = o[j + 1];
o[j + 1] = tmp;
flag = false;
}
}
// 数组已经有序,跳过无效的循环
if (flag) {
break;
}
System.out.print("第" + i + "次排序后: ");
for (int t : o) {
System.out.print(t);
System.out.print(" ");
}
System.out.println();
}
System.out.print("排序后: ");
for (int t : o) {
System.out.print(t);
System.out.print(" ");
}
System.out.println();
}
}
执行结果 不用flag
排序前: 7 6 9 3 1 5 2 4 8
第1次排序后: 6 7 3 1 5 2 4 8 9
第2次排序后: 6 3 1 5 2 4 7 8 9
第3次排序后: 3 1 5 2 4 6 7 8 9
第4次排序后: 1 3 2 4 5 6 7 8 9
第5次排序后: 1 2 3 4 5 6 7 8 9
第6次排序后: 1 2 3 4 5 6 7 8 9
第7次排序后: 1 2 3 4 5 6 7 8 9
第8次排序后: 1 2 3 4 5 6 7 8 9
排序后: 1 2 3 4 5 6 7 8 9
执行结果 使用flag
排序前: 7 6 9 3 1 5 2 4 8
第1次排序后: 6 7 3 1 5 2 4 8 9
第2次排序后: 6 3 1 5 2 4 7 8 9
第3次排序后: 3 1 5 2 4 6 7 8 9
第4次排序后: 1 3 2 4 5 6 7 8 9
第5次排序后: 1 2 3 4 5 6 7 8 9
排序后: 1 2 3 4 5 6 7 8 9
当数组的元素个数是n,那么第一趟需要(n-1)次比较。第二趟需要(n-1-1)次比较,直到第(n-1)趟是1次比较。不然发现比较次数的总和是 ∑ i = n 2 i − 1 = n ( n − 1 ) / 2 = O ( n 2 ) \displaystyle \sum_{i=n}^2 i-1=n(n-1)/2=O(n^2) i=n∑2i−1=n(n−1)/2=O(n2)。
算法只申请了几个固定的大小的空间来协助排序,空间复杂度为 O ( 1 ) O(1) O(1)