写在前言
hello,大家好,我是一点,专注于Python编程,如果你也对感Python感兴趣,欢迎关注交流。
希望可以持续更新一些有意思的文章,如果觉得还不错,欢迎点赞关注,有啥想说的,可以留言或者私信交流。
如果你想看什么主题的文章,欢迎留言交流,关注公号【一点sir】,领取编程资料。
如果你还不了解Python这门语言,要系统性的学习 Python 这门语言,可以查看我的专栏——《Python教程》
今天更新的文章是《Python应用实战,用动画生成冒泡排序的过程》。
冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
用Python实现冒泡排序
现在我们用Python语言来实现一个冒泡排序,这个应该是很简单的,以下是代码,应该很好理解吧。
def bubble_sort(arr):
n = len(arr)
# 遍历所有数组元素
for i in range(n):
# Last i elements are already in place
for j in range(0, n-i-1):
# 遍历数组从0到n-i-1
# 交换如果元素大于下一个元素
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
return arr
# 测试冒泡排序函数
arr = [64, 34, 25, 12, 22, 11, 90, 1, 10, 33]
sorted_arr = bubble_sort(arr)
print("Sorted array is:", sorted_arr)
在这个例子中,bubble_sort
函数接受一个列表 arr
作为参数,并在原地进行排序。函数首先获取列表的长度 n
,然后使用两个嵌套的循环来遍历列表中的每个元素。外层循环负责遍历整个列表,内层循环则负责比较相邻的元素并在需要时交换它们。
冒泡排序并不是一个高效的排序算法,尤其是对于大型数据集。它的平均时间复杂度和最坏时间复杂度都是 O(n^2),其中 n 是列表中的元素数量。对于实际应用,通常会选择更高效的排序算法,如快速排序、归并排序或堆排序。
用动画实现冒泡排序
要想用动画的方式实现冒泡排序,首先需要选择一个好用的可视化的第三方Python库,这里我们可以使用 matplotlib 库来创建一个简单的可视化效果。
首先,确保你你的环境已经安装了 matplotlib 库。如果还没有安装,可以通过以下命令安装:
pip install matplotlib
下面我们是直接给出实现的代码,后面我们给出详细的解释。
import matplotlib.pyplot as plt
import matplotlib.animation as animation
def bubble_sort(arr):
n = len(arr)
for i in range(n):
for j in range(0, n-i-1):
if arr[j] > arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
yield arr.copy()
def update(data):
# 更新图形,重新绘制数据
global step_count
for rect, val in zip(bar_rects, data):
rect.set_height(val)
plt.title(f"Step {step_count}")
step_count += 1
data = [64, 34, 25, 12, 22, 11, 90, 1, 10, 33]
fig, ax = plt.subplots()
bar_rects = ax.bar(range(len(data)), data, align="edge")
# 设置初始步数
step_count = 1
# 创建动画对象
anim = animation.FuncAnimation(
fig, update, frames=bubble_sort(data.copy()),
repeat=False, interval=500
)
anim.save('bubble_sort.gif')
来看下生成的效果:
代码解释
上面我们最核心的主要部分是matplotlib库中的FuncAnimation类,这是用于创建动画的类,它允许用户通过指定更新函数和帧生成器函数来生成动画。以下是这个类的接口的参数。
FuncAnimation(fig, func, frames, init_func=None, fargs=None, repeat=False, repeat_delay=0, blit=False, interval=200)
fig:需要绘制动画的图形对象。
func:更新函数,每次动画更新时调用该函数。
frames:帧生成器函数,用于生成动画的每一帧。
init_func:初始化函数,用于绘制静态内容。
fargs:更新函数func
的参数。
repeat:是否重复播放动画。
repeat_delay:重复播放时的延迟时间。
blit:是否仅绘制变化的部分,可以提高动画绘制效率。
interval:每帧的间隔时间(毫秒)。
在上面的示例代码中,我们使用了FuncAnimation
方法来创建动画对象,传入了画布对象fig
、更新函数update
、排序生成器函数bubble_sort(data.copy())
、禁止重复播放(repeat=False
)、以及每帧间隔500ms(interval=500
)。
FuncAnimation方法在后台会不断调用更新函数update
和帧生成器函数bubble_sort(data.copy())
,并根据每一帧的数据更新图形。