常用排序算法:冒泡排序

冒泡排序思路:

列表中的每两个相邻的数,如果前面比后面的大,则交换这两个数。直到列表变为有序的时候为止,例如下面这个列表
           [ 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

猜你喜欢

转载自blog.csdn.net/FanMLei/article/details/83152975