• 14java的冒泡排序


    冒泡排序

    以前学习C语言的时候学习过冒泡排序等其他排序,现在根据自己对冒泡的回忆以及理解先分析一下冒泡排序的原理 :

    主要是理解“冒泡”二字,每冒一个泡就把数组内的元素遍历一次,调整一个数字的位置(如果顺序不对的话),一共需要进行array.length-1次遍历,每次遍历需要进行array.length-i-1次比较(其中i是指第i次遍历)。图1 是第一次遍历的过程,红字是比较的两个数字,根据比较决定是否需要调整次序。下一轮依次类推。


    图1

    package Demoxx;
    
    import MethodDemo.Demo08;
    
    public class Demo01 {
        public static void main(String[] args) {
            int[] array = {5,9,8,3,1,5,7,3,6};//长度为9
            System.out.println("Sort before:");
            Demo08 demo08 = new Demo08();
            demo08.PrintArray(array);
            //冒泡排序,升序
            int temp=0;
            for (int i = 0; i < array.length; i++) {
                for (int j = array.length-1; j >0 ; j--) {
                    if (array[j] < array[j - 1]) {
                        temp = array[j - 1];
                        array[j - 1] = array[j];
                        array[j]=temp;
                    }
                }
            }
            System.out.println("Sort after:");
            demo08.PrintArray(array);
        }
    }
    

    这个排序也能正确进行排序输出,但是注意到一点,这里的每次遍历时都进行了array.length-1次数组元素的比较,思考一下,我们正在进行升序排序,上一轮已经把最大的一个元素放在了数组的最后一个索引位置,那么下一次遍历就不需要再和最后一个元素进行比较了,因为它就是最大的。

    ​ 图2

    下面是改进的冒泡排序程序

    package Demoxx;
    
    import MethodDemo.Demo08;
    
    import java.util.Arrays;
    
    public class Demo01 {
        public static void main(String[] args) {
            //冒泡排序,升序
            int[] array = {5, 9, 8, 3, 1, 5, 7, 3, 6};//长度为9
            System.out.println("Sort before:");
            Demo08 demo08 = new Demo08();
            demo08.PrintArray(array);
            int[] array_sort = sortArray(array);
            System.out.println("Sort after:");
    //        demo08.PrintArray(array);//调用自写的方法输出
            System.out.println(Arrays.toString(array_sort));//复习一下这个用法
    
        }
    
        public static int[] sortArray(int[] array) {//特别注意这里的返回值类型,int型数组需要加上[]
            int temp = 0;
            for (int i = 0; i < array.length - 1; i++) {
                for (int j = 0; j < array.length - i - 1; j++) {
                    if (array[j] > array[j + 1]) {
                        temp = array[j];
                        array[j] = array[j + 1];
                        array[j + 1] = temp;
                    }
                }
            }
            return array;//注意这里和写方法处的配合,这里不用加[]
        }
    }
    

    冒泡排序的时间复杂度:

    假如一维数组的长度是n,在最坏的情况下(需要调整所有的元素的顺序)需要进行n*(n-1)次调整,那么他的时间复杂度是O(n^2)

    还有多种排序算法,如:

    • 比较类排序:通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。
    • 非比较类排序:不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。

    算法的时间复杂度:

    • 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面。
    • 不稳定:如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。
    • 时间复杂度:对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。
    • 空间复杂度:是指算法在计算机

    内执行时所需存储空间的度量,它也是数据规模n的函数。

    自学java,请多多指教!
  • 相关阅读:
    PHP-FPM 重启
    white-space: nowrap
    php-fpm 优化
    & 引用传值
    tp3 save操作小bug误区
    用百度接口验证是否上传了身份证图片信息[非姓名,身份证号匹配]
    nginx 反向代理案例
    IOS把图片缓存到本地的几种方法
    ios沙盒查找图片展示
    iOS模拟器沙盒使用推荐
  • 原文地址:https://www.cnblogs.com/fanfada/p/13765143.html
Copyright © 2020-2023  润新知