普通冒泡排序
// 普通的冒泡排序
public static void main(String[] args) {
int [] sort = {5,9,7,4,1,3,2,8};
//循环排序的次数
for (int j = 0 ; j < sort.length -1 ; j++) {
//每一次排序比较大小
for(int i =0 ; i < sort.length -1 ; i++){
// i 和 i+1 进行比较,如果 i 大于 i+1 进入if判断 将 i 值赋值给一个变量 t ,再将 i+1 的值赋值给 i 再将变量t的值赋值给 i+1 ;
// 以此实现数字大小的排序。就像两个装满红、黑水的杯子,需要将水红杯子水倒入黑杯子里面,黑杯子水倒入红杯子里面,
// 就需要借助第三个杯子一样;此时变量t 就相当于第三个杯子;
if(sort[i] > sort[i+1]){
int t = sort[i];
sort[i] = sort[i+1];
sort[i+1] = t;
}
System.out.println(Arrays.toString( sort) );
}
}
}
打印日志如下
通过打印日志可以看出来,比较的总次数是两个for循环的乘积,从7次开始最大值已经排到最后了, 第8次就不需要在和最大值比较了
所以这里可以减少比较的次数提高效率,这里先简单优化下;
内for循环 for(int i =0 ; i < sort.length -1 - j ; i++) 多减一个 j
public static void main(String[] args) {
int [] sort = {5,9,7,4,1,3,2,8};
//循环排序的次数
for (int j = 0 ; j < sort.length -1 ; j++) {
//每一次排序比较大小
for(int i =0 ; i < sort.length -1 - j ; i++){
// i 和 i+1 进行比较,如果 i 大于 i+1 进入if判断 将 i 值赋值给一个变量 t ,再将 i+1 的值赋值给 i 再将变量t的值赋值给 i+1 ;
// 以此实现数字大小的排序。就像两个装满红、黑水的杯子,需要将水红杯子水倒入黑杯子里面,黑杯子水倒入红杯子里面,
// 就需要借助第三个杯子一样;此时变量t 就相当于第三个杯子;
if(sort[i] > sort[i+1]){
int t = sort[i];
sort[i] = sort[i+1];
sort[i+1] = t;
}
System.out.println("第" + j +" 次排序: " + Arrays.toString( sort) );
}
}
}
通过打印日志这次明显减少了循环次数,
通过打印日志可以看到最后几次比较已经没有意义了,在倒数第五次已经排序完了,所以说倒数1.2.3.4的比较就没有意义了;
以此开始优化
public static void main(String[] args) {
int[] sort = {5, 9, 7, 4, 1, 3, 2, 8};
int n = sort.length - 1;
//循环排序的次数
for (int j = 0; j < sort.length - 1; j++) {
int last = 0; // 最后一次交换的的下索引位置
//每一次排序比较大小
for (int i = 0; i < n ; i++) {
if (sort[i] > sort[i + 1]) {
int t = sort[i];
sort[i] = sort[i + 1];
sort[i + 1] = t;
last = i; // 将遍历的索引位置赋值给 last
}
System.out.println("第" + j + " 次排序: " + Arrays.toString(sort));
}
n = last; // 交换循环结束后将 last 赋值给 n ,因为 last 的内循环的局部变量,第二次外循环又变成 0 了,所以多定义一个变量 n ;
// 如果 n == 0 说明没交换的,直接退出外循环
if (n == 0) {
break;
}
}
}
通过打印日志明显看出来循环减少了很多次