插入排序动态展示3(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 * 2)
        
        # 创建画布
        self.red_canvas_height = canvas_height // 2
        self.red_canvas = tk.Canvas(root, width=canvas_width, height=self.red_canvas_height, bg="white")
        self.red_canvas.pack()
        
        self.blue_canvas = tk.Canvas(root, width=canvas_width, height=canvas_height // 2, bg="white")
        self.blue_canvas.pack()
        
        self.generate_data()

    def generate_data(self):
        # 生成新的数据
        self.data = [random.randint(1, self.canvas_height // 2) for _ in range(self.num_bars)]
        self.draw_data()

    def draw_data(self, colored_index=None):
        self.blue_canvas.delete("all")
        self.red_canvas.delete("all")
        
        for i, value in enumerate(self.data):
            x0 = i * self.bar_width * 2
            y0 = self.red_canvas_height - value
            x1 = x0 + self.bar_width
            y1 = self.red_canvas_height
            color = "red" if colored_index is not None and i in colored_index else "blue"
            canvas = self.red_canvas if color == "red" else self.blue_canvas
            canvas.create_rectangle(x0, y0, x1, y1, fill=color)
        self.root.update_idletasks()

    def insertion_sort(self):
        # 在开始排序之前,重新生成数据
        self.generate_data()

        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()

输出

在这里插入图片描述

插入排序是一种简单直观的排序算法,它的基本思想是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。其实现过程可以描述如下:

  1. 开始:假设第一个元素已经是一个有序序列,所以从第二个元素开始,将其作为当前元素。
  2. 遍历未排序部分:对于当前元素,从其下一个元素开始向前遍历,比较当前元素与已排序序列的元素大小。
  3. 插入:找到合适的位置后,将当前元素插入到已排序序列的相应位置,并将插入位置后的元素依次后移。
  4. 重复:重复以上步骤,直到所有元素都被排序。

好的,让我们开始生成随机的10个数字的列表:

随机列表:[5, 2, 9, 3, 7, 1, 8, 4, 6, 10]

现在我们将使用插入排序对这个列表进行排序。在排序过程中,我会逐步展示每次插入后的列表状态。

步骤

  1. 第一步:初始列表为 [5, 2, 9, 3, 7, 1, 8, 4, 6, 10],第一个元素 5 已经是有序的,所以我们从第二个元素开始。

已排序部分:[5]
未排序部分:[2, 9, 3, 7, 1, 8, 4, 6, 10]

  1. 第二步:将 2 插入到有序部分的合适位置。

已排序部分:[2, 5]
未排序部分:[9, 3, 7, 1, 8, 4, 6, 10]

  1. 第三步:将 9 插入到有序部分的合适位置。

已排序部分:[2, 5, 9]
未排序部分:[3, 7, 1, 8, 4, 6, 10]

  1. 第四步:将 3 插入到有序部分的合适位置。

已排序部分:[2, 3, 5, 9]
未排序部分:[7, 1, 8, 4, 6, 10]

  1. 第五步:将 7 插入到有序部分的合适位置。

已排序部分:[2, 3, 5, 7, 9]
未排序部分:[1, 8, 4, 6, 10]

  1. 第六步:将 1 插入到有序部分的合适位置。

已排序部分:[1, 2, 3, 5, 7, 9]
未排序部分:[8, 4, 6, 10]

  1. 第七步:将 8 插入到有序部分的合适位置。

已排序部分:[1, 2, 3, 5, 7, 8, 9]
未排序部分:[4, 6, 10]

  1. 第八步:将 4 插入到有序部分的合适位置。

已排序部分:[1, 2, 3, 4, 5, 7, 8, 9]
未排序部分:[6, 10]

  1. 第九步:将 6 插入到有序部分的合适位置。

已排序部分:[1, 2, 3, 4, 5, 6, 7, 8, 9]
未排序部分:[10]

  1. 第十步:将 10 插入到有序部分的合适位置。

已排序部分:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
未排序部分:[]

现在,列表已经完全排序完成。
演示过程如下:

# 初始未排序的列表
unsorted_list = [5, 2, 9, 3, 7, 1, 8, 4, 6, 10]

# 已排序的部分,开始为空
sorted_list = []

# 对未排序的列表中的每个元素进行处理
for i in range(len(unsorted_list)):
    number = unsorted_list[i]
    
    # 找到正确的位置插入数字
    j = 0
    while j < len(sorted_list) and sorted_list[j] < number:
        j += 1
    sorted_list.insert(j, number)
    
    # 输出每步完成后的已排序部分和未排序部分
    print(f"步骤 {i + 1}:")
    print("已排序部分:", sorted_list)
    print("未排序部分:", unsorted_list[i+1:])
    print()  # 空行,为了结果更清晰

# 最终输出完全排序后的列表
print("最终排序结果:", sorted_list)

实际上,通过一个list实现:

def insertion_sort(arr):
    # 获取数组长度
    n = len(arr)
    
    # 从第二个元素开始遍历
    for i in range(1, n):
        # 将当前元素存储为临时变量
        current = arr[i]
        # 与已排序序列比较并插入合适的位置
        j = i - 1
        while j >= 0 and current < arr[j]:
            arr[j + 1] = arr[j]
            j -= 1
        arr[j + 1] = current
        
    return arr

# 测试排序算法
arr = [12, 11, 13, 5, 6]
sorted_arr = insertion_sort(arr)
print("排序后的数组:", sorted_arr)

在这个实现中,我们使用了一个循环来遍历未排序的部分,并通过内部的 while 循环来比较当前元素与已排序序列的元素,找到插入位置。然后,我们将当前元素插入到找到的位置,并将插入位置后的元素依次后移,最终完成整个排序过程。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

superdont

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

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

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

打赏作者

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

抵扣说明:

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

余额充值