冒泡排序是一种简单的排序算法,它重复地遍历要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
用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()),并根据每一帧的数据更新图形。