777788888最精准四肖中特_哪里登录≡官方信誉合作伙伴

电子产品 admin 2025-04-15 19:30 11 0
马会传真…澳冂一 精解管家婆一句话

python写的堆排序动态演示程序

import matplotlib.pyplot as plt
import numpy as np
import time


def heapify(arr, n, i, ax):
    largest = i  # Initialize largest as root
    l = 2 * i + 1  # left = 2*i + 1
    r = 2 * i + 2  # right = 2*i + 2

    # See if left child of root exists and is greater than root
    if l < n and arr[i] < arr[l]:
        largest = l

    # See if right child of root exists and is greater than root
    if r < n and arr[largest] < arr[r]:
        largest = r

    # Change root, if needed
    if largest != i:
        arr[i], arr[largest] = arr[largest], arr[i]  # swap

        # 更新柱状图并暂停一段时间
        ax.clear()
        ax.bar(range(len(arr)), arr, color=['gray' if x != i and x != largest else 'red' for x in range(len(arr))])
        for j, num in enumerate(arr):
            ax.text(j, num + 1, str(num), horizontalalignment='center')
        plt.pause(1)

        # Heapify the root.
        heapify(arr, n, largest, ax)


def heap_sort(arr, ax):
    n = len(arr)

    # Build a maxheap.
    for i in range(n // 2 - 1, -1, -1):
        heapify(arr, n, i, ax)

    # Extract elements one by one
    for i in range(n - 1, 0, -1):
        arr[i], arr[0] = arr[0], arr[i]  # swap
        heapify(arr, i, 0, ax)

        # 更新柱状图并暂停一段时间
        ax.clear()
        ax.bar(range(len(arr)), arr, color='red')
        for j, num in enumerate(arr):
            ax.text(j, num + 1, str(num), horizontalalignment='center')
        plt.pause(1)


# 生成随机数组
arr = np.random.randint(1, 100, 12)

# 创建画布和轴对象
fig, ax = plt.subplots()
ax.set_title("Heap Sort")

# 绘制初始柱状图
ax.bar(range(len(arr)), arr)
for j, num in enumerate(arr):
    ax.text(j, num + 1, str(num), horizontalalignment='center')

# 刷新画布,暂停一段时间,然后开始堆排序
fig.canvas.draw()
plt.pause(1)

heap_sort(arr, ax)

# 更新柱状图并显示
ax.bar(range(len(arr)), arr)
for j, num in enumerate(arr):
    ax.text(j, num + 1, str(num), horizontalalignment='center')
fig.canvas.draw()
plt.show()