马晓萍
(喀什大学 计算机科学与技术学院,新疆喀什 844000)
冒泡排序是一种典型的、稳定排序算法[1],对初次接触程序语言的学习者来说,排序算法比较抽象,对算法的理解存在较大的障碍。如何让学生更好直观的理解排序算法的原理并用程序语言实现,是一个值得研究的问题。Unity3D 是一款实时3D 互动内容创作和运营平台,所提供的可视化、实时三维动画等类型互动内容[2],具有强大的交互功能和丰富的三维表现。利用Unity3D 实现冒泡排序算法动态可视化,是一种有效的算法可视化方式,可促进学习者对冒泡排序算法的理解。
在程序设计语言的排序算法中,冒泡排序是一种平方级的原地排序算法[3]。冒泡排序算法的原理:在待排序的一组数中,将相邻的两个数值进行比较,若前面的数值比后面的数值大就交换两数,把小数值放在前面,否则不交换;直至最终完成从小到大的排序。[4]
冒泡排序算法的程序描述(C#语言)如下:
上述代码中,通过外层for循环,用数组的长度控制整体程序的运行次数,内层for用于与前后两位数比较大小,如果存在第一个数比第二个数大,则两个数利用中间变量temp,实现交换的逻辑。
在Unity 中设计由一个Panel 容器控件,一个Text 文本控件,两个Button 按钮控件组成的UI 界面。Text控件文本内容为“冒泡排序法三维动态可视化”,当单击“随机生成数据”按钮时,在Panel 容器控件上逐个动态生成随机数据柱状图效果,此案例中随机生成9 个1~100 的整数,并产生以该整数作为动态柱状图的高度。当单击“开始冒泡排序”按钮时,在Panel 容器控件上,开始进行柱状图动态数据的交换,准备比较的两个柱状图变成绿色,等待排序比较,进行完一轮比较后所产生的最大数柱状图变成红色。
2.2.1 随机排序数据类的设计
(1)设计一个RandomData 类用于生成随机数。如图1所示。
图1 RandomData类图
部分代码如下:
(2)利用协程机制动态生成柱状图的接口设计.
该接口中,go.GetComponent<Transform>().position 语句表示动态生成柱状图的位置,t.Get-Component<Transform>().position 语句表示随机产生数据的文本显示在当前柱状图y 轴上方v.y+0.5位置。通过测试,Unity中无法直接调用接口,为了实现接口InitBarGraph()和接口Sort()的功能,本案例中编写了两个方法,使用StartCall()方法分别调用接口。调用接口InitBarGraph()参考代码如下:
动态生成随机柱状图效果图如下图2所示。
图2 随机柱状图
2.2.2 冒泡排序类的设计
(1)冒泡排序及柱状图颜色变化的接口设计。
该接口主要实现设置准备比较的两个柱状图颜色、待排数的柱状图颜色,最大数的柱状图颜色,以及进行柱状图动态数据的交换的冒泡排序功能,程序流程图如图3所示。
图3 可视化冒泡排序流程图
部分代码如下:
(2)柱状图的位置和高度的方法。
该方法用以实现柱状图、柱状图上随机数数字的位置和高度的设置,使得数据始终显示在柱状图正上方的功能。
部分代码如下:
(3)实现第一轮冒泡排序的效果图如图4 所示。
图4 第一轮冒泡排序效果图
本文利用Unity3D 平台,以“C#程序设计”课程中的冒泡排序为案例,利用协程动态生成随机数据柱状图,并以三维动态可视化实现C#脚本语言的冒泡排序算法,直观动态地展示了冒泡排序算法的基本思想和排序过程。实验证明,动态可视化的课程设计,既通过Unity3D 创建三维动态互动内容提高了学习者的学习兴趣,又加深了学习者对冒泡排序算法原理的理解性,达到了良好的教学效果。