首先分析冒泡排序图解如下
第一种:未优化的正常情况下
像挤气泡一样,一位一位比较 实现一维数组的排序
8,4,2,1,23,344,12
通过for for外循环和内循环遍历出每一轮和每一次比较
找到轮次的规律为arr.length-1
找到次数的规律为arr.length-1-i
放入代码
public class BubbleDemo {
for (int i = 0; i <arr.length-1; i++) { //i 轮数
System.out.println("目前是第"+(i+1)+"轮比较");
for (int j = 0; j <arr.length-1-i ; j++) { //j 次数
System.out.println("第"+(i+1)+"轮,第"+(j+1)+"次比较");
//交换的条件
if(arr[j] > arr[j+1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
}
}
//输出当前轮次比较的结果
System.out.println(Arrays.toString(arr));
}
//输出
System.out.println("排序后:"+Arrays.toString(arr));
}
第二种:优化轮数
加入一个标志flag即可
for (int i = 0; i <arr.length-1; i++) { //i 轮数
System.out.println("目前是第"+(i+1)+"轮比较");
//标志位
boolean flag = true;
for (int j = 0; j <arr.length-1-i ; j++) { //j 次数
System.out.println("第"+(i+1)+"轮,第"+(j+1)+"次比较");
//交换的条件
if(arr[j] > arr[j+1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
flag = false;
}
}
//输出当前轮次比较的结果
System.out.println(Arrays.toString(arr));
//当不再发生交换时,则结束比较
if(flag){
break;
}
}
//输出
System.out.println("排序后:"+Arrays.toString(arr));
第三种:优化一轮中的次数
例如
int[] arr = {4,6,3,7,8,9,10};
这样的一维数组很明显7,8,9,10都不用比较大小了
首先定一个边界limit只要内循环不在执行那么就让 limit=j; position=limit;
//定义一个作为比较的边界
int position = arr.length-1;
for (int i = 0; i <arr.length-1; i++) { //i 轮数
System.out.println("目前是第"+(i+1)+"轮比较");
//标志位
boolean flag = true;
//记录最后交换位置的值
int limit = 0;
for (int j = 0; j <position ; j++) { //j 次数
System.out.println("第"+(i+1)+"轮,第"+(j+1)+"次比较");
//交换的条件
if(arr[j] > arr[j+1]){
int temp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = temp;
flag = false;
limit = j;
}
}
position = limit;
//输出当前轮次比较的结果
System.out.println(Arrays.toString(arr));
//当不再发生交换时,则结束比较
if(flag){
break;
}
}
//输出
System.out.println("排序后:"+Arrays.toString(arr));
}
这个代码为优化一和优化二的结合。