python写的堆排序动态演示程序
作者:野牛程序员:2023-03-01 23:54:53python阅读 2771
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()野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:python写的归并排序动态演示程序
- 下一篇:python写的基数排序动态演示程序
