冒泡排序法及其优化(Java)

冒泡排序法我们都会写,但是怎么样做到效率最高,就是一个问题了。

public class Test {
    public static void main(String[] args) {
        int[] arr = {23,45,2,12,4,8,56};
        isBubbling(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void isBubbling(int[] arr) {
        boolean flag = false;
        for(int i = 0; i < arr.length - 1;i ++) {
            flag = false;
            for (int j = 0 ;j < arr.length - 1 - i;j++) {
                if (arr[j] > arr[j + 1]) {
                    int tmp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = tmp;
                    flag = true;
                }
            }
            if (flag == false) {
                break;
            }
        }
    }
}

这里主要说一下其优化的部分。
i表示要冒泡的次数,容易想到,如果有5个数,则需要排四次顺序,有四个数,则需要排三次,所有i从0下标开始,一直排到 i < arr.length 处,每次排序都要有 j 遍历整个数组,排一次以后,最后一个数就排好了,两次以后,倒数第二个数就排好了,所以遍历的次数为 j < arr.length - 1 - i, 这样这个循环执行完就对整个数组进行了排序。

但是这并不是最优的方法,一个简单的问题,如果数组本身就是有序的呢?
我们就要用到boolean类型,定义一个Boolean类型为false,如果进入了循环,即进行了排序,则将其值变为true。
那么,如果数组不需要完全进行排序,排了几步之后已经有序了呢?
这个时候就要在每次进入循环后,都要更新flag的值,将其变为false,如果没有进入排序,值不变,循环结束,排序完成!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值