冒泡排序及其优化

文章详细介绍了冒泡排序的基本原理和实现,包括两层循环的逻辑。接着,提出了两种优化策略:一是当内层循环无元素交换时提前结束外层循环,二是记录最大元素的位置来减少内层循环的比较次数。这两种优化能提高冒泡排序的效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序及其优化

图解冒泡排序

冒泡排序

  • 算法排序步骤
  1. 依次比较相邻两个元素,如果第一个比第二个大,则交换两个元素位置。

  2. 对每一对相邻元素做同样的工作。直到最后一对。这样每次最后一对的元素排序后都是最大的。

  3. 重复以上步骤直到排序完成

  • 基本算法实现
public  static  int[] sortTest(int[] arr){
        int end = arr.length -1;
        //外层for循环是循环的次数
        for (int i = 0; i < arr.length; i++) {
             //内层for循环是为了进行两两相邻元素比较。
            // 外层循环每循环一次,都会产生一个最大元素。所以内层就会少比较一次
            for (int j = 0; j < end-i; j++) {
                 //进行元素比较,较大的元素放后面。
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
        }
        return arr;
    }

优化思路:对外层或者内层循环进行次数优化。

  • 针对外层循环做优化

如果在进行某一次外层循环时候发现本次内层循环中没有进行元素交换。则说明该数组已经有序。无需进行剩下次数的比较。即退出循环。代码实现如下

public static int[] sortYouHua( int[] arr){
        int end = arr.length - 1;
        //外层for循环是循环的次数
        for (int i = 0; i < end; i++) {
            System.out.println("第"+(i+1)+"趟");
            //决定是否退出外层循环的标志位
            boolean flag = true;
            for (int j = 0; j < end-i; j++) {
            //内层for循环是为了进行两两相邻元素比较。
            // 外层循环每循环一次,都会产生一个最大元素。所以内层就会少比较一次
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    flag = false;
                }
                System.out.println("  第"+(j+1)+"次"+Arrays.toString(arr));
            }
            //进入到该条件说明数组已经有序。无需排序,跳出循环即可。
            if(flag){
                break;
            }
        }
        return arr;
    }
  • 在外层优化基础上对内层循环进行优化

在每进行一次外层循环后都会产生一个最大元素。我们记录下此时内层循环的下标。并将下一次内层循环的结束下标设置为之前记录的下标。

public static int[] sortYouHuaByPos( int[] arr){
        int end = arr.length - 1;
        int lastIndex = 0;
        for (int i = 0; i < arr.length - 1; i++) {
            boolean flag = true;
            for (int j = 0; j < end; j++) {
                if(arr[j]>arr[j+1]){
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    flag = false;
                    //记录循环排序后的最大下标
                    lastIndex = j;
                }
                System.out.println("  第"+(j+1)+"次"+Arrays.toString(arr));
            }
            //将下标赋值给内层循环结束条件
            end = lastIndex;
            if(flag){
                break;
            }
        }
        return arr;
    }

如有错误,希望大佬批评指正!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值