2.冒泡排序

# 原理:每两个相邻的数之间做比较,如果左边大的话,那么两者作交换。因此执行完一轮之后就会把最大的数放到列表的最右边
# 然后按照相同的方式比较剩余元素,最终把所有的元素都按照顺序排好
# 如果把列表竖直方向立起来,那么排序的过程就像冒泡一样,大的往上,小的往下
import random
def bubble_sort(arr):
    for i in range(len(arr)-1):  # 这里为什么减去1,因为n个元素,只需执行n-1轮,n-1个元素排好了,那么最后一个也就确定了
        for j in range(len(arr)-1-i):  # 外层循环每执行一轮,排好一个,那么就只需要排剩下的元素就行了
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]


arr = list(range(20))

random.shuffle(arr)
print(arr)  # [1, 18, 0, 15, 12, 16, 5, 7, 10, 11, 8, 13, 2, 17, 14, 3, 6, 4, 9, 19]

bubble_sort(arr)
print(arr)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

  

  

关于冒泡排序,还有个可以优化的地方,那就是不一定非要跑完len(arr)-1轮,有可能在没有跑完之前就已经排好了

import random
def bubble_sort(arr):
    for i in range(len(arr)-1):
        # 可以让flag=True
        flag = True
        # 只要没有排好,就必定会执行flag=False
        for j in range(len(arr)-1-i):
            if arr[j] > arr[j+1]:
                arr[j], arr[j+1] = arr[j+1], arr[j]
                flag = False
        # 结束函数,可以看看跑了多少轮
        if flag:
            return i


arr = list(range(20))

random.shuffle(arr)
print(arr)  # [0, 9, 13, 2, 6, 4, 1, 12, 15, 18, 8, 7, 10, 5, 3, 17, 14, 11, 16, 19]

print(bubble_sort(arr))  # 11
print(arr)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]

# 可以看到,只跑了11趟就结束了
# 如果跑满len(arr)-1趟的话,那么arr正好是逆序的

  

猜你喜欢

转载自www.cnblogs.com/traditional/p/9352296.html
今日推荐