算法在大学计算机里面是必修的课程,而排序算法又是算法内容里面的重中之重。了解算法有助于提升编程能力、增强自身逻辑思考能力、提升代码质量。但是好想学好算法也是有一定的难度的。主要原因在于算法过于抽象,不容易理解。
但是我们看看下图这样动态方式实现冒泡排序,是不是感觉更加容易理解了!!!
正好这几天正在学习python知识点,在学习Matplotlib模块时想到,我们能不能利用这个框架将排序算法做成可视化的样子,这样对于初学算法的同学岂不是又很大帮助。撸起袖子,说干就干。
# Windows 系统安装 Matplotlib
python -m pip install -U pip setuptools
python -m pip install matplotlib
注:因为国内网速的原因,有时下载会超时,建议使用国内的pip源
# Windows 系统安装 Matplotlib
python -m pip install -U pip setuptools -i https://pypi.douban.com/simple
python -m pip install matplotlib -i https://pypi.douban.com/simple
绘制柱状图
至于如何使用Matplotlib,大家可以查看菜鸟教程:NumPy Matplotlib 的内容。里面还是特别全的。
让柱状图动起来
上面的教程里面知识只有绘制静态的柱状图,我们需要排序算法每次交换位置都展示出来,达到一种动态的效果。其实这个也是比较简单的,就是每次讲原有的绘制结果擦除掉,然后重新绘制。绘制完了停顿一定的时间,然后进入下次绘制。
不多说了,开始撸代码吧!!!
排序算法的代码这里我就不说了,上网找就可以找到一大堆。这里我使用了https://blog.csdn.net/woshichaoren1/article/details/86520233博文里面的算法代码,再经过我的调整后如下所示,这里一共展示了4中可视化算法:
# -*- coding: utf-8 -*-
from matplotlib import pyplot as plt
import random
LIST_SIZE = 40
PAUSE_TIME = 4 / LIST_SIZE
# 冒泡算法
def bubble_sort(nums):
for i in range(len(nums) - 1):
for j in range(len(nums) - i - 1):
if nums[j] > nums[j + 1]:
nums[j], nums[j + 1] = nums[j + 1], nums[j]
plt.cla() # 清除内容
plt.bar(range(len(nums)), nums, align='center')
plt.bar(j, nums[j], color="r", align="center")
plt.bar(j + 1, nums[j + 1], color="r", align="center")
plt.pause(PAUSE_TIME)
plt.show()
# 插入排序
def insert_sort(nums):
for i in range(1, len(nums)):
pos = 0
for j in range(i - 1, -1, -1):
if nums[i] > nums[j]:
pos = j + 1
break
temp = nums[i]
for x in range(i, pos - 1, -1):
nums[x] = nums[x - 1]
nums[pos] = temp
plt.cla() # 清除内容
plt.bar(range(len(nums)), nums, align='center')
plt.bar(i, nums[i], color="r", align="center")
plt.bar(x, nums[x], color="g", align="center")
plt.bar(pos, nums[pos], color="r", align="center")
plt.pause(PAUSE_TIME)
plt.show()
# 选择排序
def selection_sort(nums):
for i in range(0, len(nums)):
min = i
for j in range(i + 1, len(nums)):
if nums[j] < nums[min]:
min = j
plt.cla() # 清除内容
plt.bar(range(len(nums)), nums, align='center')
plt.bar(i, nums[i], color="r", align="center")
plt.bar(j, nums[j], color="r", align="center")
plt.pause(PAUSE_TIME)
nums[i], nums[min] = nums[min], nums[i]
plt.show()
# 希尔排序
def shell_sort(nums):
step = len(nums)
while True:
step = int(step / 3 + 1)
for n in range(step):
for i in range(n + step, len(nums), step):
pos = n
for j in range(i - step, -1, -step):
if nums[i] > nums[j]:
pos = j + step
break
temp = nums[i]
for x in range(i, pos - step, -step):
plt.cla() # 清除内容
nums[x] = nums[x - step]
plt.bar(range(len(nums)), nums, align='center')
plt.bar(pos, nums[pos], color="r", align="center")
plt.bar(x, nums[x], color="r", align="center")
plt.pause(PAUSE_TIME)
nums[pos] = temp
if step <= 1:
break
plt.show()
if __name__ == "__main__":
nums = []
for i in range(LIST_SIZE):
nums.append(random.randint(0, 1000))
bubble_sort(nums)
# insert_sort(nums)
# selection_sort(nums)
# shell_sort(nums)
print(nums)