java冒泡排序之冒泡排序性能优化

普通冒泡排序

// 普通的冒泡排序
    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;
            }
        }
    }

 通过打印日志明显看出来循环减少了很多次 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值