0.如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。
    1.原理:比较两个相邻的元素,将值大的元素交换到右边
    2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
    (1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
    (2)比较第2和第3个数,将小数 放在前面,大数放在后面。
    ……
    (3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
    (4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
    (5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
    (6)依次类推,每一趟比较次数减少依次

    1. import random
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. import datetime
    5. import imageio
    6. def BubbleSort(num,start,stop):
    7. x = np.arange(1, num + 1) # 产生x数组,从1到num
    8. nums = random.sample(range(start,stop), 10) # 从(start,stop)随机产生10个不相等的整数
    9. for i in range(len(nums) - 1): # 从0 到nums元素个数减1
    10. for j in range(len(nums) - 1 - i): # 最后的i个元素比较过了,不需要再比较
    11. plt.ion() # 打开交互模式
    12. plt.cla() # 清除内容
    13. plt.bar(x, nums, color="orange",align='center') # 先绘制初始状态
    14. plt.bar(j + 1, nums[j], color="g", align="center") # 正在比较的两个元素用红色重绘
    15. plt.bar(j + 2, nums[j + 1], color="g", align="center") # 正在比较的两个元素用红色重绘
    16. plt.pause(1) # 暂停1秒
    17. nowTime = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 当前时间
    18. filename = f"{nowTime}.png"
    19. plt.savefig(filename) # 保存单张图片
    20. pngfile.append(filename)
    21. if nums[j] > nums[j + 1]: # 比较当前元素和后一个元素值的大小
    22. nums[j], nums[j + 1] = nums[j + 1], nums[j] # 若前面的元素值大于后面的值,交换顺序
    23. plt.cla() # 清除内容
    24. plt.bar(x, nums, color="orange",align='center') # 重绘制初始状态
    25. plt.bar(j+1, nums[j], color="r", align="center") # 用红色重绘交换的两个元素
    26. plt.bar(j + 2, nums[j + 1], color="r", align="center") # 用红色重绘交换的两个元素
    27. plt.pause(1) # 暂停1秒
    28. nowTime = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 当前时间
    29. filename = f"{nowTime}.png"
    30. plt.savefig(filename) # 保存单张图片
    31. pngfile.append(filename)
    32. plt.ioff() # 关闭交互模式
    33. plt.cla() # 清除内容
    34. plt.bar(x, nums, color="orange", align='center') # 重绘制初始状态
    35. filename = f"{nowTime}.png"
    36. plt.savefig(filename) # 保存单张图片
    37. pngfile.append(filename)
    38. def toGif(duration):
    39. frames = [imageio.imread(name) for name in pngfile] # 读取当前绘制的图片,加入到列表frames中
    40. imageio.mimsave('./bubblesort.gif', frames, 'GIF', duration=duration) # 生成gif图片
    41. if __name__ == '__main__':
    42. num = 10 # 参与比较的元素的个数,可改为用户输入
    43. start,stop= 0,200 # 随机元素的范围,可由用户输入
    44. duration = 0.2
    45. pngfile = []
    46. BubbleSort(num, start, stop) # 排序函数
    47. toGif(duration) # 制作gif

    06 冒泡排序 - 图1