插入排序动态展示3(Python可视化源代码)

news2024/9/20 0:57:35

修改了“开始”命令按钮,每次单击“开始”,都重新排序。

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

wasm 系列之 WebAssembly 和 emscripten 暴力上手

wasm 是什么&#xff1f; wasm 是 WebAssembly 的缩写。wasm 不是传统意义上的汇编语言&#xff0c;而是一种编译的中间字节码&#xff0c;可以在浏览器和其他 wasm runtime 上运行非 JavaScript 类型的语言&#xff0c;只要能被编译成 wasm&#xff0c;譬如 kotlin/wasm、Rus…

鸿蒙OpenHarmony【轻量系统编写“Hello World”程序】 (基于Hi3861开发板)

编写“Hello World”程序 下方将通过修改源码的方式展示如何编写简单程序&#xff0c;输出“Hello world”。请在下载的源码目录中进行下述操作。 前提条件 已参考鸿蒙开发指导文档&#xff1a;gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到…

编写函数fun,它的功能是:根据以下公式求P的值,结果由函数值带回。m与n为两个正整数且要求m>n

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法完整代码和详细的解析。 题干 编写…

【JavaEE初阶系列】——网络层IP协议(地址管理和路由选择)

目录 &#x1f6a9;网络层 &#x1f388;IP协议 &#x1f469;&#x1f3fb;‍&#x1f4bb;IP协议"拆包组包"功能 &#x1f388;地址管理 &#x1f469;&#x1f3fb;‍&#x1f4bb;IP地址的分类 &#x1f469;&#x1f3fb;‍&#x1f4bb;NAT机制如何工作的…

记录:阿里云服务器网站搭建(2)

Docker安装Mysql mysql版本 查看开发环境中mysql版本 &#xff1a;select version()&#xff1b;安装时版本尽量保证一致&#xff0c;最低要求大版本要一致 docker 拉取mysql镜像 docker pull mysql:8.0.36 docker启动mysql容器 docker run -d \ # 创建并运行一个容器&…

下班族张亮的副业赚钱故事

张亮是一个普通的上班族&#xff0c;每天过着朝九晚五的生活。他渴望改变现状&#xff0c;却又觉得生活缺乏突破口。直到有一天&#xff0c;他在网络上偶然发现了水牛社这个平台&#xff0c;这为他打开了一扇新的大门。 张亮开始利用下班后的空闲时间&#xff0c;认真浏览水牛社…

IDEA下载与安装

1.下载 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;7v5q 2.安装

综合案例(前端代码练习):猜数字和表白墙

目录 一、猜数字 html代码&#xff1a; 点击 猜 按钮的js代码&#xff1a; 点击 重开游戏 按钮的js代码&#xff1a; 整体代码&#xff1a; 页面效果&#xff1a; 二、留言板 css代码&#xff1a; html代码&#xff1a; js代码&#xff08;主逻辑在这&#xff09;&am…

JAVA高阶私房菜:JVM虚拟机核心概念及参数微调实验

目录 基础快速掌握 什么是JVM虚拟机 JVM的的实现 操作系统-虚拟机-JRE-JDK的关系 生产环境部署JDK还是JRE JVM内存组成部分和堆空间分布 内存组成 堆空间内存分布 内存分布 堆空间分配 JVM堆空间垃圾回收流程及JVM参数 垃圾回收流程 JVM参数分类 JVM参数格式分类 …

山东大学操作系统实验一(Linux虚拟机实现)

目录 实验题目 实验要求 示例程序 主程序 头文件 重点代码解析 一、main函数的参数 参数介绍 参数输入方式 本块代码 二、信号处理 本块代码 原理介绍 实现效果 三、kill函数 功能介绍 使用方式 本块代码 四、头文件处理 本块代码 代码作用 实验程序 …

Python数据可视化:频率统计条形图countplot()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 Python数据可视化&#xff1a; 频率统计条形图 countplot() [太阳]选择题 请问关于以下代码表述正确的选项是&#xff1f; import seaborn as sns import matplotlib.pyplot as plt data { …

二、python+前端 实现MinIO分片上传

python前端 实现MinIO分片上传 一、背景二、流程图三、代码 一、背景 问题一&#xff1a;前端 -> 后端 ->对象存储 的上传流程&#xff0c;耗费带宽。 解决方案&#xff1a;上传流程需要转化为 前端 -> 对象存储&#xff0c;节省上传带宽 问题二&#xff1a;如果使用…

Leetcode 第394场周赛 问题和解法

题目 统计特殊字母的数量 I 给你一个字符串word。如果word中同时存在某个字母的小写形式和大写形式&#xff0c;则称这个字母为特殊字母。 返回word中特殊字母的数量。 示例 1: 输入&#xff1a;word "aaAbcBC"输出&#xff1a;3解释&#xff1a;word 中的特殊…

【Entity Framework】聊一聊EF如何使用数据库函数

【Entity Framework】聊一聊EF如何使用数据库函数 文章目录 【Entity Framework】聊一聊EF如何使用数据库函数一、数据库函数的类型二、内置函数与用户定义的函数四、聚合函数、标量函数和表值函数五、Niladic函数六、EF Core 中的数据库函数映射6.1 内置函数映射6.2 EF.Functi…

【iOS开发】(四)react Native第三方组件五个20240419-20

react native 外的 第三方组件 目录标题 react native 外的 第三方组件&#xff08;一&#xff09;与rn核心组件的使用步骤区别&#xff1a;&#xff08;二&#xff09;第三方组件概览1 WebView2 Picker3 Swiper4 AsyncStorage5 Geolocation6 Camera (三)详细学习1 WebViewCoco…

ROS1快速入门学习笔记 - 01Linux基础

目录 一、Linux极简基础 二、C与Python极简基础 1. for循环 2. while循环 3. 面向对象 一、Linux极简基础 终端快捷键&#xff1a;ctrlaltt 命令行的操作方式 查看当前终端所在路径&#xff1a;pwd切换路径cd&#xff1b;例如cd /home/ 进入home文件夹&#xff1b;cd …

Oracle Hint 语法详解

什么是Hint Hint 是 Oracle 提供的一种 SQL 语法&#xff0c;它允许用户在 SQL 语句中插入相关的语法&#xff0c;从而影响 SQL 的执行方式。 因为 Hint 的特殊作用&#xff0c;所以对于开发人员不应该在代码中使用它&#xff0c;Hint 更像是 Oracle 提供给 DBA 用来分析诊断问…

2024数学建模时间汇总与竞赛攻略

目录 2024数学建模汇总&#xff08;时间、报名费、获奖率、竞赛级别、是否可跨校&#xff09; 中国高校大数据挑战赛 “华数杯”国际大学生数学建模竞赛 美国大学生数学建模竞赛&#xff08;美赛&#xff09; 数学中国&#xff08;认证杯&#xff09;数学建模网络挑战赛 …

从国九条的颁布简单看待未来的因子轮动

上周4月12日《关于加强监管防范风险推动资本市场高质量发展的若干意见》又称国九条出台后&#xff0c;除了本周五中东局势对大盘的影响&#xff0c;本周一波三折的行情很大程度上都是围绕着国九条展开的。一个很有意思的现象是前两次国九条发布后&#xff0c;市场都诞生了波澜壮…

【Linux开发 第八篇】定时任务

定时任务 crond任务调度at定时任务 crond任务调度 任务调度&#xff1a; 是指系统在某个时间执行特定的命令或程序 任务调度分类&#xff1a; 系统工作&#xff1a;有些重要的工作必须周而复始地执行&#xff0c;如病毒扫描等 个别用户工作&#xff1a;个别用户可能希望执行某…