冒泡排序算法(经典+标志位+鸡尾酒排序)

#  算法一:基本冒泡排序
def BubbleSort_1(arr):
    #  外层循环累计排序轮数,同时控制待排序数组的上边界,即A[0..i]为待排序部分
    #  内层循环扫描A[0..i-1],比较相邻元素,并通过交换元素值的方式将最大值顶到最上方
    for i in range(len(arr) - 1, 0, -1):
        for j in range(i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
        print('第%d次排序结果:'%(8-i),end='')
        for j in range(len(arr)):
            print('%3d'%arr[j])


#  算法二:冒泡排序改进,设置交换操作标志
def BubbleSort_2(arr):
    for i in range(len(arr) - 1, 0, -1):
        Flag = False  # 先假设未做交换操作
        for j in range(0, i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                Flag = True  # 设置交互操作标志
        if not Flag:
            break  # 无交换操作,表示已完成排序,退出循环


#  算法二:双向冒泡(鸡尾酒排序),因为未发生交换操作的区域是有序的,故每轮扫描下来可以更新上下边界,减少扫描范围
def BubbleSort_3(arr):
    low, high = 0, len(arr) - 1
    while low < high:
        swapPos = low  # 先假设最后一次发生交换操作的位置为low
        for j in range(low, high):  # 顺序扫描A[low..high-1]
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapPos = j
        high = swapPos  # 修改待排序数组的上界为最后一次发生交换操作的位置
        for j in range(high, low, -1):  # 逆序扫描A[low+1..high]
            if arr[j] < arr[j - 1]:
                arr[j], arr[j - 1] = arr[j - 1], arr[j]
                swapPos = j
        low = swapPos  # 修改待排序数组的下界为最后一次发生交换操作的位置

if __name__ == "__main__":
    lists = [3, 4, 2, 8, 9, 5, 1]
    for i in (radix_sort(lists)):
        print(i)

 

posted @ 2019-09-17 21:54  颓废不误流年  阅读(506)  评论(0编辑  收藏  举报