插入排序的可视化实现(Python)

插入排序的Python代码

import tkinter as tk
import random
import time

class InsertionSortVisualizer:
    def __init__(self, root, canvas_width=800, canvas_height=400, num_bars=10):
        self.root = root
        self.canvas_width = canvas_width
        self.canvas_height = canvas_height
        self.num_bars = num_bars
        self.bar_width = canvas_width // num_bars
        self.data = [random.randint(1, canvas_height) for _ in range(num_bars)]
        self.canvas = tk.Canvas(root, width=canvas_width, height=canvas_height)
        self.canvas.pack()
        self.draw_data()

    def draw_data(self, colored_index=None):
        self.canvas.delete("all")
        for i, value in enumerate(self.data):
            # 根据状态选择颜色,这里使用简单逻辑,可根据需要调整
            if colored_index is not None and i in colored_index:
                color = "red"
            else:
                color = "blue"
            self.canvas.create_rectangle(i * self.bar_width, self.canvas_height - value,
                                         (i + 1) * self.bar_width, self.canvas_height,
                                         fill=color)
        self.root.update_idletasks()

    def insertion_sort(self):
        for i in range(1, len(self.data)):
            key = self.data[i]
            
            # 刷新显示,将当前处理的元素标为红色
            self.draw_data([i])
            j = i - 1
            while j >= 0 and key < self.data[j]:
                self.data[j + 1] = self.data[j]
                j -= 1
                self.data[j + 1] = key
                # 刷新显示,标记正在比较的元素
                self.draw_data([j + 1])
                time.sleep(0.5)  # 延时,以便观察过程
        self.draw_data()  # 最后一步,用统一颜色画出排序后的数据

def main():
    root = tk.Tk()
    root.title("插入排序")
    app = InsertionSortVisualizer(root)

    # 开始排序按钮
    tk.Button(root, text="开始", command=app.insertion_sort).pack()
    
    root.mainloop()

if __name__ == "__main__":
    main()

运行结果

在这里插入图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

superdont

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值