• 常用排序算法:冒泡排序


    冒泡排序思路:

    列表中的每两个相邻的数,如果前面比后面的大,则交换这两个数。直到列表变为有序的时候为止,例如下面这个列表
               [ 2,  1,  3,  0,  7,  6,  5,  4]

    第一趟:
                      第一步:列表的第一位和第二位比较:如果第一位大于第二位,则交换两者位置。由于2大于1,所以此时列表 为:[1,  2,  3,  0,  7,  6,  5,  4]
                      第二步:再比较第二位和第三位,重复上面的操作,第一趟排序完成之后列表变为 [1,  2,  3,  0,   6,  5,  4 ,  7],第一 趟完成之后最大数7跑到列表最后一位了。

    第二趟: 还是从第一位开始比较,1小于2顺序不变,比较第二位和第三位2 小于3依然不变,比较第三位3大于0交换位 置, 此时列表变为[1,  2,  0,   3,   6,  5,  4 ,  7],这一趟排序完成之后列表最终变为[1,  2,  0,   3,  5,  4,   6,  7]

    冒泡排序的思想还是比较简单的,只是反复不断的比较相邻位置大小,并作交换,不再把每一步都交代明白了,只需重复上述的操作即可实现,最终裂变会变为[0,1,2,3,4,5,6,7],也就达到我们的排序目的了
        

    代码实现:

    def bubble_sort(nums):
        for i in range(len(nums) - 1):  # i表示第几趟
            for j in range(len(nums) - i - 1):  # j表示是第几个元素在比较
                if nums[j] > nums[j + 1]:  # 如果大于则交换位置
                    nums[j], nums[j + 1] = nums[j + 1], nums[j]
                    print(nums)
        return nums
    
    
    bubble_sort([2, 1, 3, 0, 7, 6, 5, 4])
    
    # [1, 2, 3, 0, 7, 6, 5, 4]
    # [1, 2, 0, 3, 7, 6, 5, 4]
    # [1, 2, 0, 3, 6, 7, 5, 4]
    # [1, 2, 0, 3, 6, 5, 7, 4]
    # [1, 2, 0, 3, 6, 5, 4, 7]
    # [1, 0, 2, 3, 6, 5, 4, 7]
    # [1, 0, 2, 3, 5, 6, 4, 7]
    # [1, 0, 2, 3, 5, 4, 6, 7]
    # [0, 1, 2, 3, 5, 4, 6, 7]
    # [0, 1, 2, 3, 4, 5, 6, 7]

    简单优化:   

    可以知道的是,如果列表是无序的,那么一趟排序的结果必然最少有一次交换,那么反过来想一下,如果一次完整的一趟没有交换任何位置,那么是不是就表明这个列表已经是有序的呢?按照这个思路我们来改进一下上面的代码。

    def bubble_sort(nums):
        for i in range(len(nums) - 1):  # i表示第几趟
            flag = False  # 是否发生交换的标志位
            for j in range(len(nums) - i - 1):  # j表示是第几个元素在比较
                if nums[j] > nums[j + 1]:  # 如果大于则交换位置
                    nums[j], nums[j + 1] = nums[j + 1], nums[j]
                    flag = True
            if not flag:  # 一趟排序完成没有发生交换直接返回
                return nums     
        return nums
  • 相关阅读:
    使用vs2010编译 Python SIP PyQt4
    谷歌编程指南
    【转】微策略面经相关资料
    KMP 算法
    C++ 拷贝构造函数
    虚继承 虚表 定义一个不能被继承的类
    cache的工作原理
    背包问题
    【转】C/C++ 内存对齐
    【转】 Linux/Unix 进程间通信的各种方式及其比较
  • 原文地址:https://www.cnblogs.com/FanMLei/p/10501001.html
Copyright © 2020-2023  润新知