最近复习java,复习到排序,关于冒泡排序算法的优化,网上的优化没怎么看到有考虑到一个最优化的情况,大都只是加一个flag判断是否发生过交换,没有发生交换则退出循环这样子。
代码如下:
1.未优化过的冒泡排序:
public static int[] sortLow(int[] arr){
for (int i = 1; i < arr.length; i++) { //第一层for循环,用来控制冒泡的次数
for (int j = 0; j < arr.length-1; j++) { //第二层for循环,用来控制冒泡一层层到最后
//如果前一个数比后一个数大,两者调换 ,意味着泡泡向上走了一层
if (arr[j] > arr[j+1] ){
int temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
2.网上大部分(最优)优化 :
/**
* 冒泡排序优化
* 加入一个布尔变量,如果内循环没有交换值,说明已经排序完成,提前终止
*/
public static int[] sortPlus(int[] arr){
if(arr != null && arr.length > 1){
for(int i = 0; i < arr.length - 1; i++){
// 初始化一个布尔值
boolean flag = true;
for(int j = 0; j < arr.length - i - 1 ; j++){
if(arr[j] > arr[j+1]){
// 调换
int temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
// 改变flag
flag = false;
}
}
if(flag){//如果没有发生交换,则已经有序,退出
break;
}
}
}
return arr;
}
3.个人觉得真正的最优:(如果有更优方案,欢迎讨论留言)
/**
* 冒泡排序优化2 最优解
* 优化比较的次数。
* 记录最后一次发生交换的位置,此位置后已经有序,不需要继续比较
* @param arr
*/
public static int[] sort(int[] arr){
if(arr != null && arr.length > 1){
int k=arr.length-1;//初始化第一趟排序的遍历范围
while(k>0){//一趟中没有发生交换,代表全部有序,k则为0,退出循环.
int emp=0;//初始化一个记录交换位置的变量
for(int j = 0; j < k ; j++){//每趟比较至上一次最后交换的位置,因为后面已经有序不需要比较
if(arr[j] > arr[j+1]){
// 调换
int temp;
temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
emp=j;//记录交换的位置
System.out.print(j);
}
}
k=emp;//最后交换位置赋值给k,以便循环判断,减少趟数
}
}
return arr;
}