学习选择排序的可视化实现(一)

学习选择排序的可视化实现(一)

选择排序的基本思路

开始:从数组的第一个元素开始,假设最小(或最大)元素就是第一个元素。
比较:遍历未排序的部分,找到实际的最小(或最大)元素。
交换:将找到的最小(或最大)元素与未排序部分的第一个元素交换位置。
重复:移动到下一个元素,重复步骤2和3,直到数组完全排序。

实现细节

在Rust中,我们可以通过以下步骤实现选择排序的可视化:

定义状态:首先,定义一个枚举SortState来表示排序的不同状态,如Idle、Sorting、Paused等。

实现选择排序步骤:创建一个函数selection_sort_step,该函数每次调用时执行一步选择排序。该函数需要记录当前的索引位置,并在每次调用时更新。

可视化设置:在主函数中,设置Piston窗口库创建可视化窗口,并初始化一组乱序数组。

事件循环:在Piston的事件循环中,根据当前的排序状态和用户输入(如开始、暂停、单步执行等),调用selection_sort_step函数执行排序步骤,并更新窗口以显示当前数组的状态。

绘制数组:每次循环时,根据数组中每个元素的值绘制对应的矩形条,以可视化地表示数组的当前状态。

extern crate piston_window;
use piston_window::*;use std::time::{Duration, Instant};#[derive(PartialEq)]
enum SortState {Idle,Sorting,Paused,Step,
}fn selection_sort_step(numbers: &mut Vec<i32>, current_index: &mut usize) -> bool {if *current_index < numbers.len() - 1 {let mut min_index = *current_index;for i in (*current_index + 1)..numbers.len() {if numbers[i] < numbers[min_index] {min_index = i;}}numbers.swap(*current_index, min_index);*current_index += 1;true} else {false // 排序完成}
}fn draw_numbers(window: &mut PistonWindow, e: &Event, numbers: &[i32], current_index: usize) {window.draw_2d(e, |c, g, _| {clear([1.0; 4], g); // 用白色清空背景let size = numbers.len();let window_size = c.get_view_size();let bar_width = window_size[0] / size as f64;for (i, &number) in numbers.iter().enumerate() {let x = i as f64 * bar_width;let y = window_size[1] - window_size[1] * (number as f64 / size as f64);rectangle(if i == current_index { [1.0, 0.0, 0.0, 1.0] } else { [0.0, 0.0, 1.0, 1.0] }, // 当前索引红色,其余蓝色[x, y, bar_width, window_size[1] - y],c.transform,g,);}});
}fn main() {let mut window: PistonWindow = WindowSettings::new("Selection Sort Visualization", [800, 600]).exit_on_esc(true).build().unwrap();let mut numbers = vec![10, 5, 3, 8, 2, 6, 4, 7, 9, 1];let mut current_index = 0usize;let mut sort_state = SortState::Idle;let mut last_update_time = Instant::now();let update_delay = Duration::from_millis(500);while let Some(e) = window.next() {if let Some(Button::Keyboard(key)) = e.press_args() {match key {Key::S => sort_state = SortState::Sorting,Key::P => sort_state = SortState::Paused,Key::N => {if sort_state == SortState::Paused || sort_state == SortState::Idle {sort_state = SortState::Step;}},Key::R => {numbers = vec![10, 5, 3, 8, 2, 6, 4, 7, 9, 1];current_index = 0;sort_state = SortState::Idle;},_ => {}}}if sort_state == SortState::Sorting || sort_state == SortState::Step {if last_update_time.elapsed() >= update_delay {if !selection_sort_step(&mut numbers, &mut current_index) && sort_state == SortState::Sorting {sort_state = SortState::Paused; // 排序完成自动暂停}last_update_time = Instant::now();if sort_state == SortState::Step {sort_state = SortState::Paused; // 单步执行后暂停}}}draw_numbers(&mut window, &e, &numbers, current_index);}
}

优化版本:

extern crate piston_window;
use piston_window::*;
use std::time::{Duration, Instant};#[derive(PartialEq)]
enum SortState {Idle,Sorting,Paused,Step,
}fn selection_sort_step(numbers: &mut Vec<i32>, current_index: &mut usize) -> bool {if *current_index < numbers.len() - 1 {let mut min_index = *current_index;for i in (*current_index + 1)..numbers.len() {if numbers[i] < numbers[min_index] {min_index = i;}}numbers.swap(*current_index, min_index);*current_index += 1;true} else {false // 排序完成}
}fn draw_numbers(window: &mut PistonWindow, e: &Event, numbers: &[i32], current_index: usize) {window.draw_2d(e, |c, g, _| {clear([1.0; 4], g); // 用白色清空背景let size = numbers.len();let window_size = c.get_view_size();let bar_width = window_size[0] / size as f64;for (i, &number) in numbers.iter().enumerate() {let x = i as f64 * bar_width;let y = window_size[1] - window_size[1] * (number as f64 / size as f64);rectangle(if i == current_index { [1.0, 0.0, 0.0, 1.0] } else { [0.0, 0.0, 1.0, 1.0] }, // 当前索引红色,其余蓝色[x, y, bar_width, window_size[1] - y],c.transform,g,);}});
}fn main() {let mut window: PistonWindow = WindowSettings::new("Selection Sort Visualization", [800, 600]).exit_on_esc(true).build().unwrap();let mut numbers = vec![10, 5, 3, 8, 2, 6, 4, 7, 9, 1];let mut current_index = 0usize;let mut sort_state = SortState::Idle;let mut last_update_time = Instant::now();let update_delay = Duration::from_millis(500);while let Some(e) = window.next() {if let Some(Button::Keyboard(key)) = e.press_args() {match key {Key::S => sort_state = SortState::Sorting,Key::P => sort_state = SortState::Paused,Key::N => {if sort_state == SortState::Paused || sort_state == SortState::Idle {sort_state = SortState::Step;}},Key::R => {numbers = vec![10, 5, 3, 8, 2, 6, 4, 7, 9, 1]; // 可以考虑添加一个函数来生成随机或特定的数字序列current_index = 0;sort_state = SortState::Idle;},_ => {}}}if sort_state == SortState::Sorting || sort_state == SortState::Step {if last_update_time.elapsed() >= update_delay {if !selection_sort_step(&mut numbers, &mut current_index) && sort_state == SortState::Sorting {sort_state = SortState::Paused; // 排序完成自动暂停}last_update_time = Instant::now();if sort_state == SortState::Step {sort_state = SortState::Paused; // 单步执行后暂停}}}draw_numbers(&mut window, &e, &numbers, current_index);}
}

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

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

相关文章

下载Node.js及其他环境推荐nvm

文章目录 项目场景&#xff1a;下载Node.js环境配置配置环境变量 安装脚手架安装依赖安装淘宝镜像安装 cnpm&#xff08;我需要安装&#xff09;nvm 安装 Node.js &#xff08;推荐&#xff09; 项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 项目…

数据库管理-第179期 分库分表vs分布式(20240430

数据库管理179期 2024-04-30 数据库管理-第179期 分库分表vs分布式&#xff08;20240430&#xff09;1 分库分表1.1 分库1.2 分表1.3 组合1.4 问题 2 分布式3 常见分布式数据库4 期望总结 数据库管理-第179期 分库分表vs分布式&#xff08;20240430&#xff09; 作者&#xff1…

《Spring-MVC》系列文章目录

简介 Spring MVC是一种基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架&#xff0c;它通过把Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09;分离&#xff0c;将web层进行职责解耦&#xff0c;把复杂…

记一次古董级netapp存储更换故障硬盘全过程

1、案例背景 记一次某医院PACS存储NetApp FAS2554更换故障硬盘的过程。 这个netapp设备以前从未调试过&#xff0c;据客户说该设备上线也有快9年了&#xff0c;头一次故障硬盘。因为己经过保了&#xff0c;客户只是采购的硬盘&#xff0c;我这来免费服务了。。。 netapp调试…

docker 基础命令

docker 安装 更新系统 sudo apt update sudo apt -y dist-upgrade安装docker sudo apt-get -y install ca-certificates curl gnupg lsb-release sudo mkdir -p /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/…

vue查询数据里面指定的数据

vue查询数据里面指定的数据 可以通过find函数进行查找&#xff0c; 以下是find函数的用法&#xff1a; this.meal_tables.find(item > item.price 10)查询的结果是复合条件的数据 注意&#xff1a; this.meal_tables为一个对象数组 meal_tables: []

Servlet(一些实战小示例)

文章目录 一、实操注意点1.1 代码修改重启问题1.2 Smart Tomcat的日志1.3 如何处理错误 一. 抓自己的包二、构造一个重定向的响应&#xff0c;让页面重定向到百度主页三、让服务器返回一个html数据四、表白墙4.1 约定前后端数据4.2 前端代码4.3 后端代码4.4 保存在数据库的版本…

力扣hot100:101. 对称二叉树(双指针以不同方式递归)

LeetCode&#xff1a;101. 对称二叉树 看了第一个样例&#xff0c;很容易直接层序遍历看每一层的前后是否相同。但接下来这个样例告诉你&#xff0c;不能这样做。 层序遍历 仔细思考会发现&#xff0c;层序遍历不能看本结点&#xff0c;但是可以看儿子结点是否对称&#xf…

【JAVA进阶篇教学】第九篇:MyBatis-Plus用法介绍

博主打算从0-1讲解下java进阶篇教学&#xff0c;今天教学第九篇&#xff1a;MyBatis-Plus用法介绍。 在 MyBatis-Plus 3.5.0 中&#xff0c;LambdaQueryWrapper支持多种条件构造方式&#xff0c;除了等于&#xff08;eq&#xff09;、不等于&#xff08;ne&#xff09;、大于&a…

tomcat篇-windows 运行tomcat的startup.bat时,终端打印的中文显示为乱码

当运行Tomcat的startup.bat时&#xff0c;如果终端中中文显示为乱码&#xff0c;这通常是因为Tomcat使用的日志输出编码与Windows命令行默认的编码不匹配。针对这一问题&#xff0c;你可以尝试以下步骤来解决&#xff1a; 1、执行startup.bat&#xff0c;在输出的窗口右击&…

【MyBatis】深入解析MyBatis:高效操作数据库技术详解

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【MyBatis】深入解析MyBatis&#xff1a;高效操作数据库技术详解 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 动态SQL1. \<if>标签2. \<trim&…

Spring - 6 ( 9000 字 Spring 入门级教程 )

一&#xff1a; SpringBoot 配置文件 1.1 配置文件作用 配置文件通常是一个文本文件&#xff0c;其中包含了程序或系统的各种设置、选项和参数。比如C:\Users, C:\Windows 文件夹, 以及各种 .config, .xml 文件 配置文件主要是为了解决硬编码&#xff08;代码写死&#xff0…

专业渗透测试 Phpsploit-Framework(PSF)框架软件小白入门教程(一)

本系列课程&#xff0c;将重点讲解Phpsploit-Framework框架软件的基础使用&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; Phpsploit-Framework&#xff08;简称 PSF&#xff09;框架软件&#xff0c;是一款什么样的软件呢&#xff1f; Phpspl…

模拟实现memcpy,memmove,memset,memcmp

memcpy void * memcpy ( void * destination, const void * source, size_t num ); 使用注意事项&#xff1a; 从source的位置向后复制num个字节数据到destination所指向的内存位置中。 这个函数遇到如果源空间和⽬标空间出现重叠&#xff0c;就得使⽤memmove函数处理。 …

【Linux入门】基础开发工具

本篇博客整理了Linux&#xff08;centOS版本&#xff09;中基础开发工具的用途和用法&#xff0c;旨在透过开发工具的使用&#xff0c;帮助读者更好地理解可执行程序的编写、编译、运行等。 目录 一、软件包管理器 yum 1.软件的下载与安装 2.Linux应用商店&#xff1a;yum …

C#描述-计算机视觉OpenCV(4):图像分割

C#描述-计算机视觉OpenCV&#xff08;4&#xff09;&#xff1a;图像分割 前言用 GrabCut 算法分割图像实例展示 前言 本文中如果有什么没说明的地方&#xff0c;大概率在前文中描述过了。 C#描述-计算机视觉OpenCV&#xff08;1&#xff09;&#xff1a;基础操作 C#描述-计算…

VTK —— 二、教程五 - 通过鼠标事件与渲染交互(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

Unity类银河恶魔城学习记录15-3 p155 More example on audio effects

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili ​ AudioManager.cs using System.Collections; using System.Collections.…

XYCTF2024 RE Trustme 复现

但是只得到用户名 admin 法一&#xff1a;猜Sql注入&#xff0c;直接万能密码 法二&#xff1a;正常逆向 jadx中的AndroidManifest.xml有奇怪之处 怀疑有加壳&#xff0c;进ProxyApplication看看 大量安卓一代壳的特征 Android第一代壳加固原理及实现 - 知乎 GitHub - Huye…

基于双层优化的电动汽车优化调度研究(附matlab程序)

基于双层优化的电动汽车优化调度研究 0.代码链接 基于双层优化的电动汽车优化调度研究(matlab程序)资源-CSDN文库 1.简述 关键词&#xff1a;双层优化 选址定容 输配协同 时空优化 参考文档&#xff1a;《考虑大规模电动汽车接入电网的双层优化调度策略_胡文平》…