<1> 可视化排序

来源:互联网 发布:js生成随机数不要 编辑:程序博客网 时间:2024/05/19 10:09

1.  简 要 概 述

 VisualSort 是一种排序教学演示程序,演示程序使用 C++ / WinForm( .Net )语言开发,开发平台为 Microsoft Visual Studio2015 Community。演示程序实现了对任意交换排序算法的每一步比较和交换的可视化演示,并支持单步模式,可以执行单步的前进/回退操作。

2.  软 件 操 作

2.1 软件的基本介绍

如下图 2-1-1 为 VisuslSort 的 UI 界面,分为左右两区域,左区域为图形绘制区域,右

区域为操作区域。右区域分为 4 个部分 : Implement、Sort、Pattern、StepPattern 四部分。

 

Implement : Start( 执行 ) 、Quit ( 退出单步模式,非单步模式不可用 )、显示步骤

Sort:排序方式( Bubble、Select、Insert 、Shell,可扩充)

Pattern : 模式选择( Normal 为正常模式,即一次性排序,Setp Pattern 为单步模式 )

Step Pattern:单步模式下执行后退/前进操作,Backward ( 后退 ) 、Forward( 前进 )  

2.2 软件的基本操作 

 · 非单步模式( 如图2-2-1 )

1选择排序方式,即:选择 Sort 部分中的任意一种排序方式。

2)   选择 Pattern 下的 Normal 模式。

3)单击 Start 按钮,即开始一次性可视化排序,排序结束后可看到排序后的结果。

4)若继续非单步模式,可重复步骤 3)继续本模式,也可选择其他模式。

 · 单步模式( 如图2-2-2 )

1选择排序方式,即:选择 Sort 下的任意一种排序方式。

2) 选择 Pattern 下的 Step Pattern 模式。

3)单击 Start 按钮,即开始单步可视化排序。

4)单击 Backward 按钮 / Forward 按钮 可以执行后退/前进操作。

5)若想退出本次排序的单步模式,单击 Quit 按钮即可。

6)退出后,可以重复步骤 3)继续执行本模式,也可选择其他模式。


3.  软 件 可 扩 展

· 逻辑程序可扩展

一次性排序模式采用“边排边绘”的处理方式,绘制的结果是依据每轮排序的结果绘制,因此只需要添加 “ 排 ” 的过程以及稍加更改即可。一次性排序过程和绘制过程分别由各自的线程控制,而两者都需要使用的内存资源设置互斥量保护,防止两个线程同时使用资源,即保护每轮的排序结果,按需依次使用。整个一次性排序模式流程大体是 “ 排序第一轮 -> 更新本轮排序后的结果->绘制排序结果->排序第二轮->更新本轮排序后的结果->绘制排序结果->排序第N轮-> 更新本轮排序后的结果->绘制排序结果->自动退出 “。单步模式下,执行排序的过程中,使用容器 1 记录每一轮的排序结果,使用容器 2 记录“ 本轮交换值在容器中的索引”。使用者在单击前进和后退按钮的时候,更新当前排序的步骤索引,使用步骤索引值得到容器中的当前步骤的排序结果和交换索引,并进行绘制,还原当时的排序过程。整个单步模式流程大体是 “ 排序第1轮->记录( 排序结果 / 交换值索引 )->排序第2轮->记录( 排序结果 / 交换值索引 )->排序第N轮->记录( 排序结果 / 交换值索引 )->排序结束 ” 。

举例:例如在 Head.h 的模板类 Sort 中的 Bubble 函数( 冒泡排序 )。

循环体中有几行代码:

if (ModelInModel == "normal"){//lockWaitForSingleObject(HMutex, INFINITE);ExchangeIndex[0] = i;ExchangeIndex[1] = j;//updatearray and step                       IArraysize = array;StepInNormal++;//unlockSleep(SleepTime);ReleaseMutex(HMutex);}else if (ModelInModel == "step pattern"){Every_Step_Of_The_Change.push_back(i);Every_Step_Of_The_Change.push_back(j);Every_Step_Of_The_Value.push_back(array);}

得出:

1. 一次性排序模式(Normal): 当排序结果更新结束后,排序线程使用

ReleaseMutex 释放互斥量,进入等待状态,然后绘制线程检测到互斥量被释放,进而把排序结果绘制,绘制结束后释放HMutex,将内存资源交给排序

线程,进入等待状态,如此反复直到排序结束。

2. 单步模式:不需要使用互斥量,记录排序过程即可。              

因此,新添加的排序算法只需要在循环体中,更新排序结果的容器即可,即在循环体中添加以上程序段,并替换交换值索引即可,可以实现扩展支持其他的排序算法。

注意: 需要目标机安装 Microsoft .NET Framework 以及处于 64 位 Windows 系统下。

源代码以及文档下载链接:可视化排序