漫画算法 P107
第一版:
简单点
第二版:
加了点flag标识,表示是否进行过交换
public static void bubbleSort(int[] arr){
int temp=0;
boolean flag = false;
for (int i=0;i<arr.length-1;i++){
for (int j=0;j<arr.length-1-i;j++){
if(arr[j]>arr[j+1]){
flag=true;
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
if (!flag){
break;
}else {
flag=false; //重置flag
}
}
}
第三版:(高,实在是高...)
[3,2,1,4,5,6,7,8] 很多元素其实是有序的.
关键点在于对有序区的界定,在每一次排序过程中,处于 无序边界之后的元素不需要比较,因为它之后是有序的
public static void bubbleSort(int[] arr){
boolean flag = false;
int lastExchange=0; //记录最后一次交换的位置
int sort=arr.length-1; //无序数列边界,每次比较到这里为止
for (int i=0;i<arr.length-1;i++){
for (int j =0;j<sort;j++){ //j<sort
int temp=0;
if(arr[j] > arr[j+1]){
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
flag=true; //有元素进行交换,不是有序的
lastExchange=j; //更新为最后一次交换的位置
}
}
System.out.println("sort: "+sort+"---lastEx:"+lastExchange);
sort=lastExchange;
if (!flag){
break;
}else {
flag=false;
}
System.out.println(i+" "+ Arrays.toString(arr));
}
}
升级版-鸡尾酒排序
[2,3,4,5,6,7,8,1] 从小到达排序 只有元素1的位置不对
第一轮:从左往右
[2,3,4,5,6,7,1,8] 1,8交换
第二轮:从右往左
第三轮:从左往右
优点:减少排序的回合数
缺点:代码量增大了
适用场景:大部分元素有序的情况