zoukankan      html  css  js  c++  java
  • 排序--冒泡排序

    1、什么是冒泡排序?

    就是把一个无序数组内的元素,从头开始,两两比较并交换位置,直到把最大(最小)的一位放置在队尾

    2、代码原理:

    • 比较相邻的元素。如果第一个比第二个大,就交换它们两个;
    • 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数;
    • 针对所有的元素重复以上的步骤,除了最后一个;
    • 重复步骤1~3,直到排序完成。

    3、代码实现

    public class ArrSort {
        public static void main(String[] args) {
            int[] arr={3,9,-1,10,20};
            int temp=0;
            for (int j=0;j<arr.length-1;j++){
                //第i遍
                for (int i=0;i<arr.length-1-j;i++){
                    if (arr[i]>arr[i+1]){ //左边元素比右边大就交换位置
                        temp=arr[i];
                        arr[i]=arr[i+1];
                        arr[i+1]=temp;
                    }
                }
                System.out.println("第"+j+"次排序");
                System.out.println(Arrays.toString(arr));
    
            }
        }
    }

    4、优化

    按照上述的代码,每次排序都要进行arr.length-1轮,但是有可能前面几轮就已经达到排序好的效果,后面做的就是无用功

     如图第二轮已经达到排序完成的效果,怎么优化?

    加一个判定条件,如果没有发生元素的交换,就说明已经排序完成了
    public class ArrSort {
        public static void main(String[] args) {
            int[] arr={3,9,-1,10,20};
            int temp=0;
            //设置一个开关
            boolean flag=false;
            for (int j=0;j<arr.length-1;j++){
                //第一遍
    
                for (int i=0;i<arr.length-1-j;i++){
                    if (arr[i]>arr[i+1]){  //发生元素交换就置为true,这一轮完成后再判断
                        flag=true;
                        temp=arr[i];
                        arr[i]=arr[i+1];
                        arr[i+1]=temp;
                    }
                }
                if (flag){  //说明发生了元素交换,继续进行下一轮
                    System.out.println("第"+j+"次排序");
                    System.out.println(Arrays.toString(arr));
                    flag=false;   //再把flag置为初始值
                }else{  //没有进行元素交换,就跳出循环条件,排序完成
                    System.out.println("排序结束");
                    break;
                }
            }
        }
    }

    5、时间复杂度

    由上述代码可发现,冒泡排序是用了双层for循环,所以O(n^2)

  • 相关阅读:
    ASP.NET Core 发布 centos7 配置守护进程
    AutoMapper在asp.netcore中的使用
    git忽略文件并删除git仓库中的文件
    Animate.css 一款牛逼的css3动画库
    URL中特殊符号的处理
    efcore 配置链接sqlserver
    简单抓取小程序大全,并展示。
    UEditor上传图片到七牛C#(后端实现)
    软件项目管理三国启示录01 群雄争霸之项目经理的自我修养
    【调侃】IOC前世今生
  • 原文地址:https://www.cnblogs.com/han200113/p/11707536.html
Copyright © 2011-2022 走看看