0.如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。
1.原理:比较两个相邻的元素,将值大的元素交换到右边
2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
(2)比较第2和第3个数,将小数 放在前面,大数放在后面。
……
(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
(6)依次类推,每一趟比较次数减少依次
import random
import numpy as np
import matplotlib.pyplot as plt
import datetime
import imageio
def BubbleSort(num,start,stop):
x = np.arange(1, num + 1) # 产生x数组,从1到num
nums = random.sample(range(start,stop), 10) # 从(start,stop)随机产生10个不相等的整数
for i in range(len(nums) - 1): # 从0 到nums元素个数减1
for j in range(len(nums) - 1 - i): # 最后的i个元素比较过了,不需要再比较
plt.ion() # 打开交互模式
plt.cla() # 清除内容
plt.bar(x, nums, color="orange",align='center') # 先绘制初始状态
plt.bar(j + 1, nums[j], color="g", align="center") # 正在比较的两个元素用红色重绘
plt.bar(j + 2, nums[j + 1], color="g", align="center") # 正在比较的两个元素用红色重绘
plt.pause(1) # 暂停1秒
nowTime = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 当前时间
filename = f"{nowTime}.png"
plt.savefig(filename) # 保存单张图片
pngfile.append(filename)
if nums[j] > nums[j + 1]: # 比较当前元素和后一个元素值的大小
nums[j], nums[j + 1] = nums[j + 1], nums[j] # 若前面的元素值大于后面的值,交换顺序
plt.cla() # 清除内容
plt.bar(x, nums, color="orange",align='center') # 重绘制初始状态
plt.bar(j+1, nums[j], color="r", align="center") # 用红色重绘交换的两个元素
plt.bar(j + 2, nums[j + 1], color="r", align="center") # 用红色重绘交换的两个元素
plt.pause(1) # 暂停1秒
nowTime = datetime.datetime.now().strftime('%Y-%m-%d-%H-%M-%S') # 当前时间
filename = f"{nowTime}.png"
plt.savefig(filename) # 保存单张图片
pngfile.append(filename)
plt.ioff() # 关闭交互模式
plt.cla() # 清除内容
plt.bar(x, nums, color="orange", align='center') # 重绘制初始状态
filename = f"{nowTime}.png"
plt.savefig(filename) # 保存单张图片
pngfile.append(filename)
def toGif(duration):
frames = [imageio.imread(name) for name in pngfile] # 读取当前绘制的图片,加入到列表frames中
imageio.mimsave('./bubblesort.gif', frames, 'GIF', duration=duration) # 生成gif图片
if __name__ == '__main__':
num = 10 # 参与比较的元素的个数,可改为用户输入
start,stop= 0,200 # 随机元素的范围,可由用户输入
duration = 0.2
pngfile = []
BubbleSort(num, start, stop) # 排序函数
toGif(duration) # 制作gif