zoukankan      html  css  js  c++  java
  • 看完了这篇,面试的时候人人都能单手撸冒泡排序!

    鸡汤给大家备好了:

    岁月流逝是多么残酷啊,对我们也是如此,不要把时间浪费在不重要的人和事情上!

    在计算机科学中,排序是一个经典的主题。学习排序算法的好处有三:

    1.创造性解决问题

    2.练习和巩固程序设计技能

    3.演示算法性能的极好例子

    冒泡排序属于比较简单的一种排序方法。但是,很多同学到现在也不能手写一个冒泡排序。甚至经过和一些刚毕业甚至工作一两年的朋友交流后,发现他们内心对算法,抱着深深的恐惧和盲目崇拜,觉得算法好像高不可攀,只适合那些高学历、高智商的人来学习和研究!今天,我想把这篇献给他们,希望他们能树立起学习的勇气和信心!

    1.什么是冒泡排序

    冒泡排序算法需要遍历几次数组,在每次遍历中,比较连续相邻的元素。如果一对元素是降序排列,则互换他们的位置,否则保持不变。这样一来,使得较小的值像“气泡”一样,逐渐浮向顶部,而较大的值沉入底部,因此称这种排序方法为冒泡排序(bubble sort )或下沉排序(sinking sort)。

    第一次遍历之后,最后一个元素将成为最大的元素。第二次遍历之后,倒数第二个元素,将成为倒数第二大的元素。整个过程持续到所有的元素全部都已排好序。

    2.图解冒泡排序

    经过第一次遍历后,最大的数已经在数组末尾。因为最后一个数已经是最大数,因此不需要再考虑最后一对元素。

    经过第二次遍历,后两个数已经排好序,所以只需要对除它们之外的元素进行排序。

    因此,在进行第n次遍历时,不需要考虑倒数第n-1个元素,因为它们已经排好序了!

    冒泡排序伪代码:

    for(int k = 1; k < list.length; k++){
        for(int j = 0; j < list.length-k; j++) {
            if(list[j] > list[j + 1]) {
                swap(list[i], list[i + 1]);
            }
        }
    }
    

    3.改进后的冒泡排序

    注意到,上面的排序实际上有很多次没有发生交换,因此,我们可以对冒泡排序稍微改进下:

    boolean nextPass = true;
    for(int k = 1; k < list.length && nextPass; k++){
        nextPass = false;
        for(int j = 0; j < list.length-k; j++) {
            if(list[j] > list[j + 1]) {
                swap(list[i], list[i + 1]);
                nextPass = true;
            }
        }
    }
    

    4. 冒泡排序时间复杂度

    最佳情况下,冒泡排序只需要一次遍历就能确定数组已排好序,不需要再进行下一次遍历。因此,最佳情况下,冒泡排序时间复杂度为O(n)。

    最坏情况下,冒泡排序需要 次。因此比较总次数为:
    $$
    (n-1) + (n-2) + (n-3) + ...+ 3 + 2 + 1 = ({frac n2^2} - {frac n2}) = O(n^2)
    $$
    所以,最坏情况下,冒泡排序的时间复杂度为:O(n^2)。

    5. 附上函数

    public static void bubbleSort(int[] list) {
        boolean nextPass = true;
        for(int k = 1; k < list.length && nextPass; k++){
            nextPass = false;
            for(int j = 0; j < list.length-k; j++) {
                if(list[j] > list[j + 1]) {
                    int tmp = list[j];
                    list[j] = list[j+1];
                    list[j+1] = tmp;
                    nextPass = true;
                }
            }
        }
    }
    

    如果你觉得文章还不错,记得关注公众号: 锅外的大佬
    刘一手的博客

  • 相关阅读:
    程序员私活话题
    关于未来房价
    关于.net core 中的signalR组件的使用
    typescript nodejs 依赖注入实现
    .net core mvc启动顺序以及主要部件4-MVC
    .net core mvc启动顺序以及主要部件3-Startup
    .net core mvc启动顺序以及主要部件2
    .net core mvc启动顺序以及主要部件1
    关于.NET HttpClient方式获取微信小程序码(二维码)
    ASP.NETCore 3.0 Autofac替换及控制器属性注入及全局容器使用
  • 原文地址:https://www.cnblogs.com/liululee/p/13956956.html
Copyright © 2011-2022 走看看