当前位置: 首页 > news >正文

WPF 实现冒泡排序可视化

WPF 实现冒泡排序可视化


实现冒泡排序代码就不过多讲解,主要是实现动画效果思路,本demo使用MVVM模式编写,读者可自行参考部分核心代码,即可实现如视频所示效果。
对于新手了解算法相关知识应该有些许帮助,至于其它类型排序,也可按该思路自行修改实现。
直接上代码,页面布局.xaml代码如下:

<UserControl x:Class="Wpf_MetroListBox.Views.Test.CanvasLabelMove"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:local="clr-namespace:Wpf_MetroListBox.Views.Test"mc:Ignorable="d" d:DesignHeight="450" d:DesignWidth="800"><Grid><Grid.RowDefinitions><RowDefinition Height="380"></RowDefinition><RowDefinition Height="*"></RowDefinition></Grid.RowDefinitions><Canvas x:Name="canvas" Grid.Row="0" Background="White"></Canvas><Grid Grid.Row="1"><Grid.ColumnDefinitions><ColumnDefinition></ColumnDefinition><ColumnDefinition></ColumnDefinition></Grid.ColumnDefinitions><Button Content="创建序列" HorizontalAlignment="Center"  Grid.Column="0" Width="70" Height="35" Command="{Binding CommitCommand}" Style="{DynamicResource btn-info-m}"></Button><Button  Content="执行排序" HorizontalAlignment="Center"  Grid.Column="1" Width="70" Height="35" Command="{Binding QueryCommand}" Style="{DynamicResource btn-info-m}"></Button></Grid></Grid></UserControl>

逻辑代码实现如下:

public partial class CanvasLabelMove : UserControl{CanvasLabelMoveViewModel vm;private Random random = new Random();private List<Label> labels = new List<Label>();private int[] array;private int delay = 1000; // 动画延迟时间(毫秒)public CanvasLabelMove(){InitializeComponent();vm = new CanvasLabelMoveViewModel();this.DataContext = vm;this.Publish(EventNames.MainWindowLoadControlEvent, "排序可视化");this.Subscriber<string>(EventNames.DataGridFocusChangedEvent, async contentStr =>{  if (contentStr.Equals("1")){InitializeArrayAndLabels();}else if (contentStr.Equals("2")){StartBubbleSortAnimation();}});}private void InitializeArrayAndLabels(){int size = 18; // 数组大小 控制标签个数array = new int[size];labels.Clear();canvas.Children.Clear();HashSet<int> randomNumbers = new HashSet<int>();Random random = new Random();//生成不重复随机数while (randomNumbers.Count < size){int nextNumber = random.Next(22, 200);randomNumbers.Add(nextNumber);}int j = 0;foreach (int number in randomNumbers){array[j] = number;j++;}for (int i = 0; i < size; i++){Label label = new Label{Content = array[i].ToString(),FontSize = 12,Width = 35,Height = array[i],Margin = new Thickness(50, 0, 0, 0),Foreground = Brushes.Black,Background = Brushes.BlanchedAlmond,VerticalContentAlignment = VerticalAlignment.Center,HorizontalContentAlignment = HorizontalAlignment.Center};             Canvas.SetLeft(label, i * 50); // 设置Label的X坐标Canvas.SetBottom(label, (canvas.ActualHeight / 2) - 100); // 设置Label的Y坐标在中间canvas.Children.Add(label);labels.Add(label);}}private async void StartBubbleSortAnimation(){for (int j = 0; j <= array.Length - 1; j++){for (int i = 0; i <= array.Length - 2; i++){if (array[i] > array[i + 1]){Swap(i, i + 1);// 更新Label位置AnimateSwap(i, i + 1);await Task.Delay(delay);}}}}private void Swap(int i, int j){int temp = array[i];array[i] = array[j];array[j] = temp;}private async void AnimateSwap(int i, int j){// 临时存储Label的位置double label1X = Canvas.GetLeft(labels[i]);double label2X = Canvas.GetLeft(labels[j]);await Task.Delay(delay / 10); // 控制动画速度var animation1 = new DoubleAnimation(label2X, TimeSpan.FromSeconds(0.5));var animation2 = new DoubleAnimation(label1X, TimeSpan.FromSeconds(0.5));labels[i].BeginAnimation(Canvas.LeftProperty, animation1);labels[j].BeginAnimation(Canvas.LeftProperty, animation2);// 最终位置//Canvas.SetLeft(labels[i], label2X);//Canvas.SetLeft(labels[j], label1X);Label tempLabel = labels[i];labels[i] = labels[j];labels[j] = tempLabel;}}public class CanvasLabelMoveViewModel : BaseValidViewModel{public CanvasLabelMoveViewModel(){}protected override void ExecuteCommitCommand(){this.Publish(EventNames.DataGridFocusChangedEvent, "1");}protected override void ExecuteQueryCommand(){this.Publish(EventNames.DataGridFocusChangedEvent, "2");}}

相关文章:

WPF 实现冒泡排序可视化

WPF 实现冒泡排序可视化 实现冒泡排序代码就不过多讲解&#xff0c;主要是实现动画效果思路&#xff0c;本demo使用MVVM模式编写&#xff0c;读者可自行参考部分核心代码&#xff0c;即可实现如视频所示效果。 对于新手了解算法相关知识应该有些许帮助&#xff0c;至于其它类型…...

Claude 3.5 新功能 支持对 100 页的PDF 图像、图表和图形进行可视化分析

Claude 3.5 Sonnet发布PDF图像预览新功能&#xff0c;允许用户分析长度不超过100页的PDF中的视觉内容。 此功能使用户能够轻松上传文档并提取信息&#xff0c;特别适用于包含图表、图形和其他视觉元素的研究论文和技术文档。 视觉PDF分析&#xff1a;用户现在可以从包含各种视觉…...

正式开源:从 Greenplum 到 Cloudberry 迁移工具 cbcopy 发布

Cloudberry Database 作为 Greenplum 衍生版本和首选开源替代&#xff0c;由 Greenplum 原始团队成员创建&#xff0c;与 Greenplum 保持原生兼容&#xff0c;并能实现无缝迁移&#xff0c;且具备更新的 PostgreSQL 内核和更丰富的功能。GitHub: https://github.com/cloudberry…...

Python如何读写文件?

1. 文件读取 &#xff08;1&#xff09;使用open()函数打开文件 基本语法是file_object open(file_name, mode)&#xff0c;其中file_name是要打开的文件的名称&#xff08;包括路径&#xff0c;如果文件不在当前目录下&#xff09;&#xff0c;mode是打开文件的模式。例如&a…...

100种算法【Python版】第38篇——Boyer-Moore算法

本文目录 1 算法说明2 算法示例3 python代码1 算法说明 Boyer-Moore算法由Robert S. Boyer和J. Strother Moore于1977年提出,旨在提高字符串匹配的效率。该算法在寻找固定模式的过程中,利用模式本身的信息,优化搜索过程,特别适合长文本中的模式查找。 算法原理 Boyer-Moo…...

贪心算法---java---黑马

贪心算法 1)Greedy algorithm 称之为贪心算法或者贪婪算法&#xff0c;核心思想是 将寻找最优解的问题分为若干个步骤每一步骤都采用贪心原则&#xff0c;选取当前最优解因为未考虑所有可能&#xff0c;局部最优的堆叠不一定得到最终解最优 贪心算法例子 Dijkstra while …...

程序员的减压秘籍:高效与健康的平衡艺术

引言 在当今竞争激烈的科技行业中&#xff0c;程序员常常面临着极高的精神集中要求和持续的创新压力。这种工作性质让许多程序员在追求高效和创新的过程中&#xff0c;感到精疲力竭&#xff0c;面临身心健康的挑战。因此&#xff0c;找到有效的方法来缓解工作压力&#xff0c;…...

2024 年 QEMU 峰会纪要

2024 年 QEMU 峰会已于 10 月 31 日在 KVM 论坛召开&#xff0c;这是一个仅对项目中最活跃的维护者和子维护者开放的邀请会议。 出席者&#xff1a; Dan Berrang Cdric Le Goater Kevin Wolf Michael S. Tsirkin Stefan Hajnoczi Philippe Mathieu-Daud Markus Armbruster Th…...

C++/list

目录 1.list的介绍 2.list的使用 2.1list的构造 2.2list iterator的使用 2.3list capacity 2.4list element access 2.5list modifers 2.6list的迭代器失效 3.list的模拟实现 4.list与vector的对比 欢迎 1.list的介绍 list的文档介绍 cplusplus.com/reference/list/li…...

刘艳兵-DBA015-对于属于默认undo撤销表空间的数据文件的丢失,哪条语句是正确的?

对于属于默认undo撤销表空间的数据文件的丢失&#xff0c;哪条语句是正确的&#xff1f; A 所有未提交的交易都将丢失。 B 数据库实例中止。 C 数据库处于MOUNT状态&#xff0c;需要恢复才能打开。 D 数据库保持打开状态以供查询&#xff0c;但除具有SYSDBA特权的用…...

树莓派基本设置--10.使用MIPI摄像头

树莓派5将以前的CSI和DSI接口合并成两个两用的CSI/DSI&#xff08;MIPI&#xff09;端口。 一、配置摄像头 使用树莓派摄像头或第三方相机可以按照下面表格修改相机配置&#xff1a; 摄像头模块文件位于&#xff1a;/boot/firmware/config.txtV1 相机 &#xff08;OV5647&am…...

【ARCGIS实验】地形特征线的提取

目录 一、提取不同位置的地形剖面线 二、将DEM转化为TIN 三、进行可视分析 四、进行山脊、山谷等特征线的提取 1、正负地形提取&#xff08;用于校正&#xff09; 2、山脊线提取 3、山谷线的提取 4、河网的提取 5、流域的分割 五、鞍部点的提取 1、背景 2、目的 3…...

HTML 基础标签——表格标签<table>

文章目录 1. `<table>` 标签:定义表格2. `<tr>` 标签:定义表格行3. `<th>` 标签:定义表头单元格4. `<td>` 标签:定义表格单元格5. `<caption>` 标签:为表格添加标题6. `<thead>` 标签:定义表格头部7. `<tbody>` 标签:定义表格…...

线程函数和线程启动的几种不同形式

线程函数和线程启动的几种不同形式 在C中&#xff0c;线程函数和线程启动可以通过多种形式实现。以下是几种常见的形式&#xff0c;并附有相应的示例代码。 1. 使用函数指针启动线程 最基本的方式是使用函数指针来启动线程。 示例代码&#xff1a; #include <iostream&g…...

数组排序简介-基数排序(Radix Sort)

基本思想 将整数按位数切割成不同的数字&#xff0c;然后从低位开始&#xff0c;依次到高位&#xff0c;逐位进行排序&#xff0c;从而达到排序的目的。 算法步骤 基数排序算法可以采用「最低位优先法&#xff08;Least Significant Digit First&#xff09;」或者「最高位优先…...

进程间通信(命名管道 共享内存)

文章目录 命名管道原理命令创建命名管道函数创建命名管道 共享内存原理shmgetFIOK 代码应用&#xff1a;premsnattch 命名管道 用于两个毫无关系的进程间的通信。 原理 Linux文件的路径是多叉树&#xff0c;故文件的路径是唯一的。 让内核缓冲区不用刷新到磁盘中&#xff0c…...

Python 网络爬虫教程:从入门到高级的全面指南

Python 网络爬虫教程&#xff1a;从入门到高级的全面指南 引言 在信息爆炸的时代&#xff0c;网络爬虫&#xff08;Web Scraping&#xff09;成为了获取数据的重要工具。Python 以其简单易用的特性&#xff0c;成为了网络爬虫开发的首选语言。本文将详细介绍如何使用 Python …...

深度学习:正则化(Regularization)详细解释

正则化&#xff08;Regularization&#xff09;详细解释 正则化&#xff08;Regularization&#xff09;是机器学习和统计建模领域中用以防止模型过拟合同时增强模型泛化能力的一种技术。通过引入额外的约束或惩罚项到模型的损失函数中&#xff0c;正则化能够有效地限制模型的…...

Freertos学习日志(1)-基础知识

目录 1.什么是Freertos&#xff1f; 2.为什么要学习RTOS&#xff1f; 3.Freertos多任务处理的原理 1.什么是Freertos&#xff1f; RTOS&#xff0c;即&#xff08;Real Time Operating System 实时操作系统&#xff09;&#xff0c;是一种体积小巧、确定性强的计算机操作系统…...

CentOS9 Stream 支持输入中文

CentOS9 Stream 支持输入中文 方法一&#xff1a;确保 gnome-control-center 和相关组件已更新方法二&#xff1a;手动添加输入法源配置方法三&#xff1a;配置 .xinputrc 文件方法四&#xff1a;检查语言包 进入centos9 stream后&#xff0c;点击右上角电源键&#xff0c;点击…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

MMaDA: Multimodal Large Diffusion Language Models

CODE &#xff1a; https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA&#xff0c;它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构&#xf…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

如何在网页里填写 PDF 表格?

有时候&#xff0c;你可能希望用户能在你的网站上填写 PDF 表单。然而&#xff0c;这件事并不简单&#xff0c;因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件&#xff0c;但原生并不支持编辑或填写它们。更糟的是&#xff0c;如果你想收集表单数据&#xff…...