版本一
只考虑算法的实现
public static void version1(int[] array) {
for (int i = 0; i < array.length-1; i++) {
for (int j = 0; j < array.length-i-1; j++) {
if (array[j]>array[j+1]) {
int temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
}
}
}
}
版本二
如果数组的某一部分本身就是有序的,能显著减少循环的趟数
public static void version2(int[] array) {
for (int i = 0; i < array.length-1; i++) {
boolean flag=true;
for (int j = 0; j < array.length-i-1; j++) {
if (array[j]>array[j+1]) {
int temp=array[j+1];
array[j+1]=array[j];
array[j]=temp;
flag=false;
}
}
if (flag) break;
}
}
分析:我们假设在进行某趟排序时已经有序了,以boolean flag=true来标识这种假设,如果说在该趟排序判断大小时存在数值交换,即此时还不是有序的,如果有序了则不会在判断后进行数值交换,也就是不满足这种假设此时将标识flag赋值为false。 如果说在该趟循环中,每次判断大小都没有进行数值交换,那说明数组已经有序了此时不会改变flag的值 当值为true时直接跳出该趟循环。
演示
public class BubbleSort {
public static void main(String[] args) {
int[] a= {1,6,5,23,7,8,9};
int[] b= {1,6,5,23,7,8,9};
version1(a);
for (int i : a) {
System.out.print(i+" ");
}
version2(b);
for (int i : b) {
System.out.print(i+" ");
}
}
结果:
第1趟循环
第1趟第1次循环
第1趟第2次循环
第1趟第3次循环
第1趟第4次循环
第1趟第5次循环
第1趟第6次循环
第2趟循环
第2趟第1次循环
第2趟第2次循环
第2趟第3次循环
第2趟第4次循环
第2趟第5次循环
第3趟循环
第3趟第1次循环
第3趟第2次循环
第3趟第3次循环
第3趟第4次循环
第4趟循环
第4趟第1次循环
第4趟第2次循环
第4趟第3次循环
第5趟循环
第5趟第1次循环
第5趟第2次循环
第6趟循环
第6趟第1次循环
1 5 6 7 8 9 23
第1趟循环
第1趟第1次循环
第1趟第2次循环
第1趟第3次循环
第1趟第4次循环
第1趟第5次循环
第1趟第6次循环
第2趟循环
第2趟第1次循环
第2趟第2次循环
第2趟第3次循环
第2趟第4次循环
第2趟第5次循环
1 5 6 7 8 9 23
可以看出减少了循环次数 在一定程度上得到了优化
某些与算法无关的代码在写博客时没有带上