0.如果遇到相等的值不进行交换,那这种排序方式是稳定的排序方式。
1.原理:比较两个相邻的元素,将值大的元素交换到右边
2.思路:依次比较相邻的两个数,将比较小的数放在前面,比较大的数放在后面。
(1)第一次比较:首先比较第一和第二个数,将小数放在前面,将大数放在后面。
(2)比较第2和第3个数,将小数 放在前面,大数放在后面。
……
(3)如此继续,知道比较到最后的两个数,将小数放在前面,大数放在后面,重复步骤,直至全部排序完成
(4)在上面一趟比较完成后,最后一个数一定是数组中最大的一个数,所以在比较第二趟的时候,最后一个数是不参加比较的。
(5)在第二趟比较完成后,倒数第二个数也一定是数组中倒数第二大数,所以在第三趟的比较中,最后两个数是不参与比较的。
(6)依次类推,每一趟比较次数减少依次
import randomimport numpy as npimport matplotlib.pyplot as pltimport datetimeimport imageiodef BubbleSort(num,start,stop):x = np.arange(1, num + 1) # 产生x数组,从1到numnums = random.sample(range(start,stop), 10) # 从(start,stop)随机产生10个不相等的整数for i in range(len(nums) - 1): # 从0 到nums元素个数减1for 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.2pngfile = []BubbleSort(num, start, stop) # 排序函数toGif(duration) # 制作gif

