• 排序算法-冒泡排序


    一、冒泡排序

         一种简单的排序算法,它重复地遍历待排序的数列,比较相邻的两个元素并按照升序或降序交换它们的位置,从而将最大或最小的元素逐渐“浮”到数组的顶端或底端。

        按照冒泡排序的思想,我们要把相邻的元素两两比较,当一个元素大于右侧相邻元素时,交换它们的位置;当一个元素小于或等于右侧相邻元素时,位置不变。过程如下: 

        冒泡排序是一种稳定排序,值相等的元素并不会打乱原本的顺序。由于该排序算法的每一轮都要遍历所有元素,有n个数,总共遍历(n-1)轮,所以平均时间复杂度是O (n2)。

    (1) 基本-冒泡排序

    1. def bubbleSort(ll):
    2. #外层循环(轮数)
    3. for i in range(len(ll)-1):
    4. #内层循环(次数)
    5. for j in range(len(ll)-i-1):
    6. #判断两两比较
    7. if ll[j]>ll[j+1]:
    8. #第一个>第二个,则交换
    9. ll[j],ll[j + 1] = ll[j + 1],ll[j]
    10. if __name__ == '__main__':
    11. ll=[5,8,6,3,9,2,1,7]
    12. print('排序前:')
    13. print(ll)
    14. bubbleSort(ll)
    15. print('排序后:')
    16. print(ll)

      当排序算法分别执行到第6轮、第7轮时,数列状态如下: 

        很明显,经过第6轮排序后,整个数列已经是有序了,可是排序算法仍然兢兢业业地继续执行了第7轮排序。 

     (2) 优化-冒泡排序

    1. def bubbleSort2(ll):
    2. #外层循环(轮数)
    3. for i in range(len(ll)-1):
    4. #标识:有序
    5. flag=True
    6. #内层循环(次数)
    7. for j in range(len(ll)-i-1):
    8. #判断两两比较
    9. if ll[j]>ll[j+1]:
    10. #第一个>第二个,则交换
    11. ll[j],ll[j + 1] = ll[j + 1],ll[j]
    12. #还是无序,进行比较交换
    13. flag=False
    14. #数列有序,就直接退出循环
    15. if flag:
    16. break

     (3) 优化-双向冒泡排序

    1. def bubbleSort3(ll):
    2. #外层循环(轮数)
    3. for i in range(len(ll)//2):
    4. #标识:有序
    5. flag=True
    6. # 奇数轮,从左向右比较和交换
    7. #内层循环(次数)
    8. for j in range(i,len(ll)-i-1):
    9. #判断两两比较
    10. if ll[j]>ll[j+1]:
    11. #第一个>第二个,则交换
    12. ll[j],ll[j + 1] = ll[j + 1],ll[j]
    13. #还是无序,进行比较交换
    14. flag=False
    15. #数列有序,就直接退出循环
    16. if flag:
    17. break
    18. # 偶数轮之前,重新标记为true
    19. # 标识:有序
    20. flag = True
    21. # 偶数轮,从右向左比较和交换
    22. # 内层循环(次数)
    23. for j in range(len(ll) - i - 1,i,-1):
    24. # 判断两两比较
    25. if ll[j] < ll[j - 1]:
    26. # 第一个>第二个,则交换
    27. ll[j], ll[j -1] = ll[j - 1], ll[j]
    28. # 还是无序,进行比较交换
    29. flag = False
    30. # 数列有序,就直接退出循环
    31. if flag:
    32. break

       很明显,这个排序的优点是能够在特定条件下,减少排序的回合数;而缺点也很明显,就是代码量几乎增加了1倍。

     

  • 相关阅读:
    推荐给前端开发的 5 款 Chrome 扩展
    华贝甄选干细胞科技,揭秘生命修复的奥秘
    开启全新教学模式!vLive虚拟直播如何赋能线上教培
    Handler同步屏障学习
    Himall类型帮助类将string类型转换成decimal类型
    ++和*(解引用)的优先级
    ubuntu18.04 LTS卸载qtcreator-10.0.2
    dpdk 内存管理 原理剖析
    记录--基于Vue2.0实现后台系统权限控制
    List与数组之间的相互转换
  • 原文地址:https://blog.csdn.net/hlx20080808/article/details/138064269