zoukankan      html  css  js  c++  java
  • python算法-冒泡排序

    冒泡排序

    一、python冒泡排序算法:

    #enconding = utf-8

    def Bubble_Sort(listx):
    #i确定比较次数
    for i in xrange(len(listx)-1):
    #j确定比较的是哪个元素
    for j in xrange(len(listx)-1-i): #通过i确定比较到哪里
    #我们可以这样去把所有元素每次都全部比较一轮,但其实是没有必要的,效率低。
    #for j in xrange(len(listx)-1):

    if listx[j]>listx[j+1]:
    listx[j],listx[j+1] = listx[j+1],listx[j]
    return listx

    if __name__ == '__main__':
    print Bubble_Sort([12,32,23,34,2])

    二、过程解释:将一个列表lista按,lista中存有n个数字按从小到大的顺序进行排序。我们依次比较lista[i]和lista[i+1],如果lista[i]大于ista[i+1]就将这两个数的位置交换,第一轮比较完成后,最大的数字会排到列表的最后。之后继续循环排剩下的n-1个数,直到完成所有的排序,由于每次都是把最大的排到最后面,就好像冒泡一样,故取名冒泡排序。

    举例1: lista = [41,23,5,9,20],对lista按从小到大的顺序进行排序。

    冒泡排序手工比较的过程:

    第一轮比较:41与23比较,41>23,位置交换;41再分别向后比较,并按大小规则确定是否交换位置

    第一轮比较结果:23,5,9,20,41

    第一轮比较完成后,可以看到43作为列表中最大的数字已经排到了lista的最后。

    第二轮比较:23与5比较,23>5,位置交换;23在依次向后比较,比较到20时停下,我们第一轮已经确定41是最大的并且移到了最后

    第二轮比较结果:5,9,20,23,41

    第三轮比较:5与9比较,5<9,不做交换;9和20比较,9<20也不做互换

    第三轮比较结果:5,9,20,23,41

    第四轮比较:5与9做比较,5<9,不做交换

    第四轮比较结果:5,9,20,23,41

    到这里就已经完成了对整个lista的冒泡排序了。

     

    举例2:

    对listb=[12,32,23,34,2]按从小到大排序。

    第一轮:12,23,32,2,34

    第二轮:12,23,2,32,34

    第三轮:12,2,23,32,34

    第四轮:2,12,23,32,34

    可以看出,对于一个含有n个元素的列表,冒泡比较多少次可以确保所有元素都被遍历到?答案是 n-1次

     

    疑问:举例1到第二轮结束其实已经完成了对lista的排序,为什么后面还有第三轮、第四轮的比较呢?

    答案:从算法的角度来讲,对含有n个元素的列表比较时,是需要比较n-1次,才能确保每一个元素都被遍历到。由于上面例子中的排列顺序特殊,所以我们会感觉后面的比较其实是没有变化的。

     

    三、冒泡排序的时间复杂度

    时间复杂度的计算方法:

    1、得到算法的计算次数
    2、把计算次数中,保留最大的项式,去掉其它项式
    3、把最大项式的因子去掉
    4、匹配上述公式,得到O表示的时间复杂度

    对于冒泡排序,我们来算一下一共比较了多少次

    还是用上面的例子,对listb=[12,32,23,34,2]按从小到大排序。

    第一轮:12,23,32,2,34  比较4次;即n=5,比较了n-1次

    第二轮:12,23,2,32,34  比较3次;即n=5,比较了n-2次

    第三轮:12,2,23,32,34  比较2次;

    第四轮:2,12,23,32,34  比较1次

    以此类推: 冒泡排序总计比较次数应该是  n-1 + n-2 + n-3 +......+3+2+1

    我们对此等差数列进行求和,Sn=n(a1+an)/2,注意:上面的式子是到n-1项,所以带入等差数列求和公式 (n-1)*(1+n-1)/2 = n(n-1)/2

    按照上面时间复杂度的计算方法,去掉其他项保留最大项,且最大的影响结果是n^2,因此结果是 n^2

    故冒泡排序的时间复杂度为 O(n^2)

  • 相关阅读:
    java运算符
    Java中的变量与常量
    java 的数据类型
    Windows Server 2012 R2上安装.Net4.6.1出错
    数据库面试基础知识整理
    C语言面试程序阅读整理
    C语言面试基础知识整理
    Android Studio工程项目打包成SDK(jar或aar格式)
    Android Studio 添加引用Module项目
    Android Studio打包SDK后,为什么没有bundles文件夹?
  • 原文地址:https://www.cnblogs.com/qingqing-919/p/8330489.html
Copyright © 2011-2022 走看看