📜  使用Python可视化冒泡排序(1)

📅  最后修改于: 2023-12-03 15:06:53.308000             🧑  作者: Mango

使用 Python 可视化冒泡排序

冒泡排序是最简单的排序算法之一。它重复地走访过要排序的元素列,依次比较相邻两个元素大小,如果发现逆序则交换。因为排序的过程中,较小或较大元素会经由交换慢慢"浮"到数列的顶端,故名。

在本文中,我们将使用 Python 实现冒泡排序,并通过数据可视化的方式展示排序过程。

冒泡排序实现

下面是 Python 实现冒泡排序的代码:

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]

    return arr

这个实现非常简单,它使用两个嵌套循环,每次比较相邻元素的大小,并在必要时交换它们的位置。外部循环迭代列表中的每个元素,而内部循环则从列表的开头迭代到当前未排序的最后一个元素。

可视化冒泡排序

我们可以使用 Python 的 matplotlib 库来可视化冒泡排序的过程。首先,我们来实现一个函数来绘制一个条形图,每个条形的高度表示相应的数字大小。

import matplotlib.pyplot as plt
import matplotlib.animation as animation

def plot_bars(arr):
    fig, ax = plt.subplots()
    ax.set_xticks([])
    ax.set_yticks([])
    ax.bar(range(len(arr)), arr)

接下来,让我们编写一个函数,该函数将冒泡排序应用于数字列表,并将排序过程可视化为动画。

def bubble_sort_visual(arr):
    fig, ax = plt.subplots()
    ax.set_xticks([])
    ax.set_yticks([])

    def update(i):
        for j in range(len(arr) - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

        ax.clear()
        ax.bar(range(len(arr)), arr)

    anim = animation.FuncAnimation(
        fig,
        update,
        frames=len(arr) - 1,
        repeat=True
    )

    plt.show()

在这个实现中,我们定义了一个名为 update 的函数,该函数在每个帧上被调用以更新数字列表。内部循环仍然实现比较和交换逻辑。在每次交换后,我们清除了图形,并使用 bar 函数重新绘制了条形图。

最后,我们使用 matplotlib.animation 模块的 FuncAnimation 函数来创建一个 animation 对象,并使用 show 函数显示动画。

现在,我们可以使用以下代码运行动画:

arr = [3, 2, 1, 5, 4]
bubble_sort_visual(arr)

当我们运行这段代码时,我们可以看到动画,它显示了冒泡排序算法在数字列表上的应用。

bubble-sort-visualization

总结

在本文中,我们使用 Python 编写了一个冒泡排序算法,并通过 matplotlib 库可视化了其排序过程。这是学习 Python 算法和数据可视化的良好实践。该技术可以应用于其他排序算法的可视化,以及可以用于其他类型的数据可视化。