冒泡排序算法(经典+标志位+鸡尾酒排序)
# 算法一:基本冒泡排序 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)