插入排序动态展示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 循环来比较当前元素与已排序序列的元素,找到插入位置。然后,我们将当前元素插入到找到的位置,并将插入位置后的元素依次后移,最终完成整个排序过程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/561558.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【软考中级】21 真题整理

选择题 1、在CPU中&#xff0c;用&#xff08; &#xff09;给出将要执行的下一条指令在内存中的地址。 (A) 程序计数器 (B) 指令寄存器 (C) 主存地址寄存器 (D) 状态条件寄存器 试题答案&#xff1a;A 试题解析&#xff1a; A 选项程序计数器PC&#xff1a;存储下一条要执行指…

C++ 深入理解 继承

本篇文章将谈谈一下几个问题&#xff1a; 1.基类和派生类对象赋值转换 2.继承中的作用域 3.派生类的默认成员函数 4.复杂的菱形继承及菱形虚拟继承 5.其他 1.基类和派生类对象赋值转换 1.派生类对象 可以赋值给 基类的对象 / 基类的指针 / 基类的引用。这里有个形象的说法叫切…

一文学会 ts 构建工具 —— tsup

文章目录 能打包什么&#xff1f;安装用法自定义配置文件条件配置在 package.json 中配置多入口打包生成类型声明文件sourcemap生成格式自定义输出文件代码分割产物目标环境支持 es5编译的环境变量对开发命令行工具友好监听模式 watch提供成功构建的钩子 onSuccess压缩产物 min…

每日一题:计数质数

给定整数 n &#xff0c;返回 所有小于非负整数 n 的质数的数量 。 示例 1&#xff1a; 输入&#xff1a;n 10 输出&#xff1a;4 解释&#xff1a;小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0示例 3&#…

Vue 指令、计算属性、侦听器

目录 指令 指令修饰符 按键修饰符 ​编辑 v-model修饰符 事件修饰符 v-bind对于样式操作的增强 操作class 对象 数组 操作style v-model应用于其他表单元素 computed计算属性 概念 基础语法 ​编辑 计算属性vs方法 computed计算属性 作用 语法 缓存特性 m…

【Linux 杂货铺】进程间通信

1.进程为什么要通信呢&#xff1f; ①&#x1f34e; 为了进程之间更好的协同工作&#xff0c;举个例子&#xff0c;在学校&#xff0c;学院的管理人员给教师安排课程的时候&#xff0c;必须事先知道该教师平常的上课情况&#xff0c;不然会将教师的课程安排到一起造成麻烦&…

YetnotherrokenKeoard

问题描述: 思路:用vector存储数据,一个l用来存放小写的部分的下标,一个u来存放大写的部分的下标,删的时候删除下标即可,然后按照顺序输出即可 #include<iostream> #include<cmath> #include<algorithm> #include<vector> using namespace std; in…

Linux驱动开发——(一)设备树的基本属性及其应用

目录 一、常见基本属性 1.1 compatible属性 1.2 status属性 1.3 reg属性 1.4 #address-cells属性和#size-cells属性 二、基本属性在设备树的表现 三、基本属性在驱动代码的表现 3.1 驱动代码 3.2 驱动代码中的OF函数 3.2.1 of_find_node_by_path 3.2.2 of_find_prope…

nginx反向代理.NetCore开发的基于WebApi创建的gRPC服务

一、本文中使用的工具: Vs2022使用.NET 8.0开发基于ASP.NET Core WebApi的gRPC服务; Nginx:1.25.5,下载地址:http://nginx.org/en/download.html 二、gRPC介绍: 由 google 开发,是一款语言中立、平台中立、开源的远程过程调用(RPC)系统。在vs2022中可以直接创建gRP…

随机森林(Random Forests)

通过5个条件判定一件事情是否会发生&#xff0c;5个条件对这件事情是否发生的影响力不同&#xff0c;计算每个条件对这件事情发生的影响力多大&#xff0c;写一个随机森林&#xff08;Random Forests&#xff09;模型程序,最后打印5个条件分别的影响力。 ChatGPT 下面是一个使…

数据赋能(63)——要求:IT部门职责

“要求&#xff1a;IT部门职责”是作为标准的参考内容编写的。 在数据赋能中&#xff0c;IT部门职责在于以提供原始数据核心&#xff0c;确保提供原始数据是真实、及时和完整性&#xff0c;以支持业务赋能的实现。 在数据赋能中&#xff0c;IT部门职责涉及多个方面&#xff0c…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之二 简单人脸检测添加戴眼镜效果 一、简单介绍 二、简单人脸检测添加戴眼镜效…

【Linux学习】Linux编辑器vim的配置

文章目录 &#x1f526;vim的配置&#x1f526;vim的配置文件&#x1f526;添加配置的方法&#x1f526;手动添加相关特性配置&#xff1a;&#x1f526;自动化配置 &#x1f526;vim的配置 &#x1f526;vim的配置文件 在目录 /etc/ 下面&#xff0c;有个名为vimrc的文件&…

SpringMVC Controller 层没有使用 @ResponseBody 注解引发的血案(api访问404)

问题现象&#xff1a; 项目组的一个同事发现在请求该接口时候&#xff0c;总是报 404 错误&#xff0c;又找不到错误日志&#xff0c;一时之间不知道该如何去着手解决问题&#xff0c;我帮他排查问题的时候&#xff0c;发现该接口两次经过拦截器的 preHandle 方法&#xff0c;…

URL地址解析至页面展示全过程(面试详细解答)

目录 1、解析URL 2、缓存判断 ​编辑3、DNS解析 ​编辑4、获取MAC地址 5、TCP三次握手 6、HTTP请求 7、服务器处理请求&#xff0c;返回HTTP响应 8、页面渲染 9、TCP四次挥手 10、浏览器解析HTML 11、浏览器布局渲染 1、解析URL 首先会对 URL 进行解析&#xff0c;…

目标检测算法演变:从R-CNN到Faster R-CNN【AI写作一键生成】

首先&#xff0c;这篇文章是基于笔尖AI写作进行文章创作的&#xff0c;喜欢的宝子&#xff0c;也可以去体验下&#xff0c;解放双手&#xff0c;上班直接摸鱼~ 按照惯例&#xff0c;先介绍下这款笔尖AI写作&#xff0c;宝子也可以直接下滑跳过看正文~ 笔尖Ai写作&#xff1a;…

【Day 3】Ajax + Vue 项目、路由 + Nginx

1 Ajax Asynchronous JavaScript And XML 异步的 JavaScript 和 XML 作用&#xff1a; 数据交换 通过 Ajax 可以给服务器发送请求&#xff0c;并获取服务器响应的数据 异步交互 可以在不重新加载整个页面的情况下&#xff0c;与服务器交换数据并更新部分网页的技术&#xf…

车载以太网DoIP 协议,万字长文详解

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

欢迎大家光临成都市

我现在就在家里&#xff0c;刚刚理个发&#xff0c;洗个澡 爸妈也在家里&#xff0c;一切正常&#xff0c;但是QQ上不了&#xff0c;哎呀,又长胖了&#xff0c;不好意思

Next App Router(上)

目录 1. 文件系统&#xff08;file-system&#xff09; 2. 从 Pages Router 到 App Router 3. 使用 App Router 4. 定义页面&#xff08;Pages&#xff09; 路由&#xff08;Router&#xff09;是 Next.js 应用的重要组成部分。在 Next.js 中&#xff0c;路由决定了一个页面…