zoukankan      html  css  js  c++  java
  • 算法学习:冒泡排序

    1、思路

    对于数组s:

      每一轮,遍历数组,比较相邻的两个数,交换位置,大的放后面;
      第一轮,得到最大的数,比较len(s) - 1 次
      第二轮,得到第二大的数。。。。
      第len(s)-1轮,得到第2小和最小的数。
      所以要比较len(s)-1 轮。
     
    2、举例
    原始数组:[9,5,4,3,2]
    第一轮
      • 第一次:9>5==>[5,9,4,3,2]
      • 第二次:9>4==>[5,4,9,3,2]
      • 第三次:9>3==>[5,4,3,9,2]
      • 第四次:9>2==>[5,4,3,2,9]
    第一轮排序结果:[5,4,3,2,9]
     
    第二轮
      • 第一次:5>4==>[4,5,3,2,9]
      • 第二次:5>3==>[4,3,5,2,9]
      • 第三次:5>2==>[4,3,2,5,9]
    第二轮排序结果:[4,3,2,5,9]
     
    第三轮
      • 第一次:4>3==>[3,4,2,5,9]
      • 第二次:4>2==>[3,2,4,5,9]
    第三轮排序结果:[3,2,4,5,9]
     
    第四轮
    • 第一次:3>2==>[2,3,4,5,9]
    结果:[2,3,4,5,9]
     
    3、总结
    对于一个长度为n的数组,进行排序归纳总结:
      1 对于有n个元素的数组进行排序,需要经过n-1轮
      2 第i轮比较的次数为 n-i
     
    4、代码
    def bubble(arr):
        length = len(arr)
        #控制排序的轮数
        for i in range(length-1):
            #控制排序的次数
            print('第%s轮'%(i+1))
            for j in range(length-1-i):
                print('比较第%s和第%s个数:'%(j,j+1))
                if arr[j]>arr[j+1]:
                    arr[j],arr[j+1]=arr[j+1],arr[j]
                    print('比较排序的结果是:',arr)
        return arr
    
    arr=[9,5,4,3,2]
    print(bubble(arr))

    结果:

    D:>py -3 a.py
    第1轮
    比较第0和第1个数:
    比较排序的结果是: [5, 9, 4, 3, 2]
    比较第1和第2个数:
    比较排序的结果是: [5, 4, 9, 3, 2]
    比较第2和第3个数:
    比较排序的结果是: [5, 4, 3, 9, 2]
    比较第3和第4个数:
    比较排序的结果是: [5, 4, 3, 2, 9]
    第2轮
    比较第0和第1个数:
    比较排序的结果是: [4, 5, 3, 2, 9]
    比较第1和第2个数:
    比较排序的结果是: [4, 3, 5, 2, 9]
    比较第2和第3个数:
    比较排序的结果是: [4, 3, 2, 5, 9]
    第3轮
    比较第0和第1个数:
    比较排序的结果是: [3, 4, 2, 5, 9]
    比较第1和第2个数:
    比较排序的结果是: [3, 2, 4, 5, 9]
    第4轮
    比较第0和第1个数:
    比较排序的结果是: [2, 3, 4, 5, 9]
    [2, 3, 4, 5, 9]

    5、时间复杂度
    使用两层循环即可实现我们的冒泡排序的算法:
      I.使用for循环控制排序的轮数,排序的轮数为 len(s) - 1
      II.内层嵌套循环控制每轮排序的次数,每轮排序的次数为n-i
      III.排序过程中依次比较arr[i]与arr[i+1],大的放后面
      IV.外层循环结束后返回原数组
    时间复杂度:O(n^2)

  • 相关阅读:
    【转】如何删除一个repository(仓库)
    【转】Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)
    【转】android 开发 命名规范
    【转】精简深拷贝ArrayList实例
    【转】关于Adapter的The content of the adapter has changed问题分析 关于Adapter的The content of the adapter has changed问题分析
    从 BM 到 RBM
    从 BM 到 RBM
    Gibbs 采样的应用
    Gibbs 采样的应用
    MCMC:Gibbs 采样(matlab 实现)
  • 原文地址:https://www.cnblogs.com/hqq2019-10/p/14085868.html
Copyright © 2011-2022 走看看