冒泡排序是我们经常见到的一种排序,也是在面试题中经常出现的排序
eg:将9、8、7、6、5从小到大排序,下面是冒泡排序的思路
第一趟:第①次:8、9、7、6、5
② 8、7、9、6、5
③ 8、7、6、9、5
④ 8、7、6、5、9(将9的找了出来)
第二趟:第①次:7、8、6、5、9
② 7、6、8、5、9
③ 7、6、5、8、9(将8找了出来)
第三趟:第①次:6、7、5、8、9
② 6、5、7、8、9(把7找了出来)
第四趟:第①次:5、6、7、8、9(将6找了出来)
分析可知:趟数=数组长度-1;次数=数组长度-1-趟数
次数在趟数里面
下面是冒泡排序的初级版
public static void bublle(int[] a) {
int i,j;
for(j = 0;j < a.length-1;j++) { //趟数
for(i = 0;i<a.length-1-j;i++) { //次数
if(a[i]>a[i+1]) {
int temp = a[i];
a[i] = a[i+1];
a[i+1] = temp;
}
}
}
System.out.println(Arrays.toString(a));
}
上述的原始顺序是从小到大经过整合之后变成从小到大,所以趟数和次数最多;如果原始数据并不是从小到大排序,而是杂乱无章的,那么趟数和次数就会减少,所以可以将程序进行以下整改:先假定有序,如果有序则break,无序则执行条件。
下面是冒泡排序的优化版(避免有序情况下的无意义比较循环):
public static void bublle(int[] arr) {
boolean sort = true; //假定有序
for(int j = 0;j<arr.length-1;j++) {
for(int i = 0;i<arr.length-1-j;i++) {
if(arr[i]>arr[i+1]) {
int temp = arr[i];
arr[i] = arr[i+1];
arr[i+1] = temp;
sort = false; //假定失败
}
}
if(sort) { //减少趟数
break;
}
}
System.out.println(Arrays.toString(arr));
}