• 数据结构排序算法之冒泡排序


    一 相关概念

    稳定排序:如果原数据中a在b之前,而且a=b,排序后a任然在b之前
    不稳定排序:如果原数据中a在b之前,而且a=b,排序后a在b之后
    时间复杂度:对排序数据的总的操作次数,反映当n变化时候,操作次数呈现出什么规律
    空间复杂度:指算法在计算机内执行时所需要的存储空间的度量,他也是数据规模n的函数。

    冒泡排序原理

    1. 比较相邻的元素。如果前一个元素比后一个元素大,就交换这两个元素的位置。
    2. 对每一对相邻元素做同样的工作,从开始第一对元素到结尾的最后一对元素。最终最后位置的元素就是最大值。

    三 动图分析

    在这里插入图片描述

    四 代码设计

    4.1 API设计

    在这里插入图片描述

    4.2 API实现

    public class Bubble {
        /*
           对数组a中的元素进行排序
        */
        public static void sort(Comparable[] a){
            for(int i=a.length-1;i>0;i--){
                for(int j=0;j<i;j++){
                    //{6,5,4,3,2,1}
                    //比较索引j和索引j+1处的值
                    if (greater(a[j],a[j+1])){
                        exch(a,j,j+1);
                    }
                }
            }
        }
    
        /*
            比较v元素是否大于w元素
         */
        private static  boolean greater(Comparable v,Comparable w){
            return v.compareTo(w)>0;
        }
    
        /*
        数组元素i和j交换位置
         */
        private static void exch(Comparable[] a,int i,int j){
            Comparable temp;
            temp = a[i];
            a[i]=a[j];
            a[j]=temp;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    4.3 测试代码

    public class MainActivity extends AppCompatActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Integer[] a = {4, 5, 6, 3, 2, 1};
            Bubble.sort(a);
            System.out.println(Arrays.toString(a));
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    4.4 测试结果

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/a0ae9fa8c4694db89f4d10694a32ce8c.png

    五 冒泡排序的时间复杂度分析

    冒泡排序使用了双层for循环,其中内层循环的循环体是真正完成排序的代码,所以,
    我们分析冒泡排序的时间复杂度,主要分析一下内层循环体的执行次数即可。
    在最坏情况下,也就是假如要排序的元素为{6,5,4,3,2,1}逆序,那么:
    元素比较的次数为:
    (N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)(N-1)/2=N^2/2-N/2;
    元素交换的次数为:
    (N-1)+(N-2)+(N-3)+…+2+1=((N-1)+1)
    (N-1)/2=N^2/2-N/2;
    总执行次数为:
    (N2/2-N/2)+(N2/2-N/2)=N^2-N;
    按照大O推导法则,保留函数中的最高阶项那么最终冒泡排序的时间复杂度为O(N^2)

  • 相关阅读:
    2022年Java秋招面试必看的|Java并发编程面试题
    Reactor 模式网络服务器【I/O多路复用】(C++实现)
    数字孪生变电站如何制作?虚拟现实项目强荐广州华锐互动
    antd中在vue项目中自定义穿梭框
    关于相机的思考
    循环神经网络的网络结构,循环神经网络应用举例
    安全两方推理问题
    通信原理 | 基本概念:信源、信道、噪声、信宿等
    一篇玩转mybatis-plus框架的详细讲解(入门必备)
    智慧工地管理平台系统厂家哪家强|喜讯科技
  • 原文地址:https://blog.csdn.net/qq_39431405/article/details/127967238