zoukankan      html  css  js  c++  java
  • 冒泡排序(Bubble Sort)

    标签

    稳定排序、原地排序、比较排序

    基本思想

    与插入排序不同,冒泡排序是一种基于交换的排序算法。基于交换的排序,是指根据线性表中两个元素关键字的比较结果来对换这两个元素在序列中的位置

    假如待排序线性表的长度为$n$,从前往后两两比较相邻元素的关键字,若$a_{i - 1} > a_i$,则交换它们,直到线性表比较完成。每趟交换以后最后一个元素一定是最大的,不再参与下一趟交换。也就是对于第$i$趟交换,只需要比较到$a_{n - i}$即可。直到一趟比较内没有进行交换,算法结束。

    算法描述

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

    动图演示

    时间复杂度

    和插入排序一样,也为$O(n^2)$。

    最好的情况:如果待排序数据序列为正序,则一趟冒泡就可完成排序,排序码的比较次数为$n - 1$次,且没有移动,时间复杂度为$O(n)$。

    最坏的情况:如果待排序数据序列为逆序,则冒泡排序需要$n - 1$次趟起泡,每趟进行$n - i$次排序码的比较和移动,即比较和移动次数均达到最大值: 比较次数:$C_{max} = sum_{i = 1}^{n − 1} (n − i) = n frac{(n−1)}{2} = O(n^2)$ 。移动次数等于比较次数,因此最坏时间复杂度为$O(n^2)$。

    平均情况:$O(n^2)$

    空间复杂度

    没有额外的空间开销。

    算法示例

    参考资料:

    https://blog.csdn.net/coolwriter/article/details/78732728

    https://blog.csdn.net/weixin_41190227/article/details/86600821

    https://www.cnblogs.com/itsharehome/p/11058010.html

    Min是清明的茗
  • 相关阅读:
    HTTP学习三:HTTPS
    JavaScript判断变量的类型
    用JS创建10个<a>标签,点击的时候弹出来对应的序号
    【工具】根据后端提供的swagger生成前端的axios请求配置文件/api
    JavaScript正则表达式-零宽断言
    JavaScript中数组去重、对象去重的方法
    收集的无版权图片网站(欢迎补充)
    css 清除浮动
    JavaScript+CSS+HTML 编写手风琴效果
    Mac定制终端:iTerm2 + zsh + powerline
  • 原文地址:https://www.cnblogs.com/MinPage/p/14103976.html
Copyright © 2011-2022 走看看