冒泡排序法我们都会写,但是怎么样做到效率最高,就是一个问题了。
public class Test {
public static void main(String[] args) {
int[] arr = {23,45,2,12,4,8,56};
isBubbling(arr);
System.out.println(Arrays.toString(arr));
}
public static void isBubbling(int[] arr) {
boolean flag = false;
for(int i = 0; i < arr.length - 1;i ++) {
flag = false;
for (int j = 0 ;j < arr.length - 1 - i;j++) {
if (arr[j] > arr[j + 1]) {
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
flag = true;
}
}
if (flag == false) {
break;
}
}
}
}
这里主要说一下其优化的部分。
i表示要冒泡的次数,容易想到,如果有5个数,则需要排四次顺序,有四个数,则需要排三次,所有i从0下标开始,一直排到 i < arr.length 处,每次排序都要有 j 遍历整个数组,排一次以后,最后一个数就排好了,两次以后,倒数第二个数就排好了,所以遍历的次数为 j < arr.length - 1 - i, 这样这个循环执行完就对整个数组进行了排序。
但是这并不是最优的方法,一个简单的问题,如果数组本身就是有序的呢?
我们就要用到boolean类型,定义一个Boolean类型为false,如果进入了循环,即进行了排序,则将其值变为true。
那么,如果数组不需要完全进行排序,排了几步之后已经有序了呢?
这个时候就要在每次进入循环后,都要更新flag的值,将其变为false,如果没有进入排序,值不变,循环结束,排序完成!