排序算法不好理解?那就来个 GUI 的!
上篇C语言实现各排序算法的完成,使得自己对排序有了一定的了解,最近看到一个 iOS 图形化排序过程,因此今天就完成 Android 端的图形化排序过程。
排序算法实现很简单,其重点是要实现安卓 View 跟随排序的动态变化。
由于计算机执行排序算法的高效性,对一定数量的数组排序都是 毫秒级 的,因此我们要考虑 放大排序时间,给可视化界面完整的动态过程。
一、总体功能界面
界面
功能
- 六种排序算法完成
- 可视动态化界面实现
- 时间计时器
- 算法时间复杂度说明
项目
- Android 图形化排序地址:https://github.com/jiyiren/JYSort
- C 实现排序项目地址:https://github.com/jiyiren/CSort
二、实现重点
数据与界面的初始化
- 数据是随机生成 100个数组 成一个数组,当然这个长度我们定义成全局变量,可以自行修改。
- 界面的初始化由上到下分别为 Toolbar菜单栏、主体排序可视窗口、时间复杂度 等。
- 重点在于中间主体排序 可视窗口的绘制:因为可视的 View 就是要表示数组中各个数据的大小,因而我们就将每个柱状 View 的高度用于表示数组中各个数据的大小,但是由于手机界面有限,如果有的数据过大那么绘制将超出屏幕。因此我们采取将 3/5 个屏幕像素与数组中最大值的比值作为每个数转为高度的一个因素,也就是说数组中数据不管多大,其高度最高最大为 3/5 个屏幕大小。而其宽度则是根据数组长度由屏幕宽度计算得出,具体如下:
1 | //初始化界面的柱状图 |
排序同时界面更新
- 界面的中每个柱状View与数组一一对应,这样我们只需要记住排序数组的下标就可以同步View数组了。
- 排序是耗时操作,我们需要开启线程进行排序,因此需要用到消息传递来通知界面的变化,这里主要使用Handler来进行处理线程消息。
- 整个流程为:在开启排序时,算法中的数组在进行数据交换时,我们会记录此时交换数据的两个下标,同时将这些数据包装成消息发送给Handler,Handler将界面柱状View数组中两个相同下标的View高度互换,达到界面显示与排序一致的效果。
1 | /** |
排序延迟操作
由于排序算法只有在对数以万计的数据时才会有可见的时间长度,因而我们如果像正常一样设置排序和界面更新时,每个排序算法都几乎在毫秒级别完成,并且界面变化几乎不可见。
因此,我们需要让排序算法尽可能地延长一定时间,达到界面的变化可视化级别。
我们在数组交换数据时发送消息给 Handler 处进行了一定的时间延迟,当然不会过长,此处设置了 10ms。( 也同时因为这样的设置,界面显示的耗时操作实际上并非算法真正的排序时间,而应该减去延迟时间乘以延迟操作的次数。)
1 | //交换的信号 |
三、动画演示
快速排序
堆排序
归并排序
插入排序
冒泡排序
选择排序
四、总结
项目
- Android图形化排序地址:https://github.com/jiyiren/JYSort
- C实现排序项目地址:https://github.com/jiyiren/CSort