zoukankan      html  css  js  c++  java
  • 经典排序之冒泡排序

    冒泡排序(Bubble Sort)是一种比较经典的排序算法。

    之所以称为“冒泡排序” ,是因为在排序中,越大(降序排列)或越小(升序排列)的相邻元素会经由交换逐渐“浮”到前面,有如 水中浮出的水泡,故形象地命名为“冒泡排序”。

    冒泡排序主要对相邻的两个元素进行比较。

    在时间复杂度方面,若数据集的初始状态是正序的,一趟扫描即可完成排序。这时,排序中的比较 次数和移动次数均达到最小值,其时间复杂度O(N)。

    若数据集的初始状态是反序的,需要进行n-1趟排序;每趟排序要进行n-i次关键字的比较 (1≤i≤n-1)。在这种情况下,比较和移动次数均达到最大值,其时间复杂度为O(n²)。

    总的来说,冒泡排序的平均时间复杂度为O(n²)。

    我们接下来通过代码来看冒泡排序。

    package 排序算法.冒泡排序;
    
    import java.util.Arrays;
    
    /**
     * 未优化的冒泡排序
     */
    public class Demo1 {
        public static void main(String[] args) {
            int[] arr = new int[]{15, 32, 14, 86, 54, 78, 36};
            System.out.println("排序前的数组:" + Arrays.toString(arr));
            System.out.println("排序中:");
            int k = 0;
            for (int j = 0; j < arr.length - 1; j++) {
                for (int i = 0; i < arr.length - 1; i++) {
                    if (arr[i] > arr[i + 1]) {
                        int temp = arr[i];
                        arr[i] = arr[i + 1];
                        arr[i + 1] = temp;
                    }
                    System.out.println("第 " + (++k) + " 次:" + Arrays.toString(arr));
                }
            }
            System.out.println("排序后的数组:" + Arrays.toString(arr));
        }
    }
    

       上述代码运行结果如下:

    排序前的数组:[15, 32, 14, 86, 54, 78, 36]
    排序中:
    第 1 次:[15, 32, 14, 86, 54, 78, 36]
    第 2 次:[15, 14, 32, 86, 54, 78, 36]
    第 3 次:[15, 14, 32, 86, 54, 78, 36]
    第 4 次:[15, 14, 32, 54, 86, 78, 36]
    第 5 次:[15, 14, 32, 54, 78, 86, 36]
    第 6 次:[15, 14, 32, 54, 78, 36, 86]
    第 7 次:[14, 15, 32, 54, 78, 36, 86]
    第 8 次:[14, 15, 32, 54, 78, 36, 86]
    第 9 次:[14, 15, 32, 54, 78, 36, 86]
    第 10 次:[14, 15, 32, 54, 78, 36, 86]
    第 11 次:[14, 15, 32, 54, 36, 78, 86]
    第 12 次:[14, 15, 32, 54, 36, 78, 86]
    第 13 次:[14, 15, 32, 54, 36, 78, 86]
    第 14 次:[14, 15, 32, 54, 36, 78, 86]
    第 15 次:[14, 15, 32, 54, 36, 78, 86]
    第 16 次:[14, 15, 32, 36, 54, 78, 86]
    第 17 次:[14, 15, 32, 36, 54, 78, 86]
    第 18 次:[14, 15, 32, 36, 54, 78, 86]
    第 19 次:[14, 15, 32, 36, 54, 78, 86]
    第 20 次:[14, 15, 32, 36, 54, 78, 86]
    第 21 次:[14, 15, 32, 36, 54, 78, 86]
    第 22 次:[14, 15, 32, 36, 54, 78, 86]
    第 23 次:[14, 15, 32, 36, 54, 78, 86]
    第 24 次:[14, 15, 32, 36, 54, 78, 86]
    第 25 次:[14, 15, 32, 36, 54, 78, 86]
    第 26 次:[14, 15, 32, 36, 54, 78, 86]
    第 27 次:[14, 15, 32, 36, 54, 78, 86]
    第 28 次:[14, 15, 32, 36, 54, 78, 86]
    第 29 次:[14, 15, 32, 36, 54, 78, 86]
    第 30 次:[14, 15, 32, 36, 54, 78, 86]
    第 31 次:[14, 15, 32, 36, 54, 78, 86]
    第 32 次:[14, 15, 32, 36, 54, 78, 86]
    第 33 次:[14, 15, 32, 36, 54, 78, 86]
    第 34 次:[14, 15, 32, 36, 54, 78, 86]
    第 35 次:[14, 15, 32, 36, 54, 78, 86]
    第 36 次:[14, 15, 32, 36, 54, 78, 86]
    排序后的数组:[14, 15, 32, 36, 54, 78, 86]
    

    上述是未优化的结果;,优化后的代码如下:

    package 排序算法.冒泡排序;
    import java.util.Arrays;
    /**
     * 优化后的冒泡排序;相邻元素比较,小的浮上来
     */
    public class Test {
        static void bubleSort(int[] intArr){
            int k=0;//统计每次排序后的状态
            for(int i=0;i<intArr.length-1;i++){
                boolean boo=false;//判断数组是否存在无序状态,false表示已经有序
                for(int j=0;j<intArr.length-1;j++){
                    if(intArr[j]>intArr[j+1]){
                        boo=true;
                        int temp=intArr[j];
                        intArr[j]=intArr[j+1];
                        intArr[j+1]=temp;
                    }
                }
                if(!boo){
                    break;//如果数组已经有序,则不必再循环
                }
                k++;
                System.out.println("第"+k+"次排序:"+ Arrays.toString(intArr));
            }
        }
        public static void main(String[] args) {
            int[] arr=new int[]{15,32,14,86,54,78,36};
            System.out.println("排序前的数组:"+Arrays.toString(arr));
            bubleSort(arr);
            System.out.println("排序后的数组:"+Arrays.toString(arr));
        }
    }
    

      上述代码运行结果如下:

    排序前的数组:[15, 32, 14, 86, 54, 78, 36]
    第1次排序:[15, 14, 32, 54, 78, 36, 86]
    第2次排序:[14, 15, 32, 54, 36, 78, 86]
    第3次排序:[14, 15, 32, 36, 54, 78, 86]
    排序后的数组:[14, 15, 32, 36, 54, 78, 86]
    

      可见,优化后的代码,比原先重复排序(36-3=33)减少33次之多。

  • 相关阅读:
    为结构体中函数指针赋值的两种方法(转)
    (obj) error: LNK2019: 无法解析的外部符号解决方法
    js cookie存储方法
    js关于对象键值为数字型时输出的对象自动排序问题的解决方法
    HTML5 LocalStorage 本地存储的用法
    onhashchange事件,只需要修改hash值即可响应onhashchange事件中的函数(适用于上一题下一题和跳转页面等功能)
    js实现页面a向页面b传参的方法
    前端比较好的学习资料(包括js和css)以及 最全前端资源汇集
    字符串js编码转换成实体html编码的方法(防范XSS攻击)
    fis3使用环境
  • 原文地址:https://www.cnblogs.com/lizhangyong/p/8045927.html
Copyright © 2011-2022 走看看