前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序以及快速排序。俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客的总结了。而本篇博客的示例Demo也是在之前那些博客Demo的基础上做的,也算是集成了各种排序的方法,然后给出了可视化的解决方案。今天博客的内容还是比较有趣的。

因为本猿是做iOS开发的,所以就使用iOS相关的组件来表示上述各种排序的过程。使用可视化方式来感受一下上述这些排序方法的异同。本篇博客所使用的相关的排序代码都是来自于之前的博客。因为我们在之前实现各种排序Demo时,我们定义了相应的排序接口SortType,所以上述的七种排序对外的调用方式是一致的,所以在此基础上给出相应排序的可视化解决方案并不困难。本篇博客就会给出其相应的扩展过程。

如果你想对上述7中排序进行详细的了解,请移步与之前的博客《冒泡排序、插入排序、希尔排序、选择排序》、《堆排序》、《归并排序》、《快速排序》、《基数排序》。废话少说,开始今天的博客。

一、可视化解决方案综述

1.交互UI综述

在本篇博客的第一部分我们先来整体的看一下我们Demo的功能。下方就是我们今天博客中的Demo的交互示意图。上方的输入框可以输入要排序元素的个数,下方输入的是300。程序会根据你输入的个数来随机生成数据,你输入300,就会随机生成300个数据提供排序使用。下方的SegmentControl可以选择不同的排序方式,本篇博客给出了7中常用的排序方式,选择完排序方式后可以点击右上方的排序按钮进行相应的排序。

下方显示的不同颜色的颜色条就是我们要排序的东西,我们会按照从小到大的方式对这些色条进行排序。左图中是未排序的状态,右图中是已经排序的状态。我们上面随机生成的数据反应到色条上就是色条的高度,我们按照色条的高度进行从小到大的排序。下方会给出每种排序的介绍。

  

2、部分核心代码实现

为了实现今天的Demo,我们需要对之前我们实现的那一些列的排序的方法进行扩展。因为我们之前在实现各种排序时,我们先定义了SortType接口,依据“开放封闭原则”,我们可以为各种排序的类创建一个“简单工厂”以供我们的视图层使用。关于设计模式更多以及更详细的内容,可以移步之前发布的设计模式系列博客《设计模式Swift版》。

  

上方就是为各种Sort类提供的“简单工厂”。上面这个简单工厂在视图控制器中点击SegmentControl时会使用,因为我们在选择不同排序类的时候需要使用不同的排序对象。下方就是我们视图控制器对“简单工厂”的调用,当然我们所有排序类都有父类,你也可以使用“工厂方法”来创建相应的对象,在此就不做过多赘述了。

下方代码段就是点击SegmentControl要调用的方法,其中从“简单工厂”中获取到相应排序方式的对象后,然后在设置相应的闭包回调

  

二、冒泡排序

接下来我们来逐一看一下每种排序的具体效果。下方就是冒泡排序的效果,因为冒泡排序的时间复杂度是O(n^2)的,所以我们先设置元素个数是80, 如果太大的话会比较慢。因为我们在排序步骤结果输出时,每进行一次交换操作或者比较操作让排序线程休眠0.001秒,便于我们观察整个排序过程。

从下方这个动图上我们不难看出冒泡的整个过程,较小的数据从右往左以此往外冒。下方这个效果还是比较直观的,整个冒泡过程就是从后往前比较,如果后边的数要比前边的小就交换。冒泡过程如下所示:

  

三、选择排序

选择排序的时间复杂度也是O(n^2)。下方是“选择排序”的可视化过程,选择排序的过程就是从无序序列中找出最小的那个值放到有序序列中最后方。不断执行这个过程,我们的序列就是有序的了。下方就是选择排序的整个过程,元素的个数是80.

  

四、插入排序

插入排序的复杂度与上述选择排序的时间复杂度一样,都是O(n^2)。下方就是插入排序的运行结果。插入排序是从无序序列中取出第一个值,然后插入到前方有序序列中相应的位置。每次插入后,有序序列就会增加1,无序序列就会减少1。下方就是插入排序的过程,如下所示:

  

五、希尔排序

希尔排序的效率要高一些,其时间复杂度是O(n^(3/2))。下方就是希尔排序的具体执行步骤,希尔排序又称为缩小增量排序。该排序方式是插入排序的升级版,等增量缩小到1时,我们的序列就是有序的了。下方就是希尔排序的具体执行步骤,如下所示:

  

六、堆排序

堆排序比希尔排序更为高效,其时间复杂度为O(nlog2n)。下方的“堆排序”是根据大顶堆来进行排序的,大顶堆第一个值是序列中最大的,我们可以利用这一点获取无序序列中最大的那个值。首先我们将序列调整为大顶堆,然后把大顶堆的第一个值与最后一个值进行交换,然后再将剩下的序列调整成大顶堆,然后进行下一轮的替换。

  

七、归并排序

归并排序的时间复杂度也是O(nlog2n)。归并排序就是将无序数组拆分成多个只有一个元素的数组,然后进行两两合并。在合并的过程中将两个数组中的元素进行比较,将较小的放在前方,两个有序的数组合并后依然是有序的,然后再次进行两两合并,直到合并成一个数组为止。下方就是归并排序的执行顺序,从执行过程中,我们可以清楚的看到在排序过程中被分割的小的有序序列。归并排序的执行过程如下所示:

  

八、快速排序

快速排序的时间复杂度为O(nlog2n)。下方是快速排序的执行步骤,快速排序是利用里分治法的思想。从无序序列中取出一个值,比该值大的放在前方,比该值小的放在后方。然后递归执行前半部分和后半部分依次递归下去,我们的序列就是有序的了。

  

九、基数排序

下方是基数排序的运行效果,我们先输入1000个元素,生成1000个随机数,选择基数排序。如下所示:

  

十、上述排序的比较

关于上述排序的比较,在此就不做过多赘述了,就引用“维基百科”中的表格来说明吧,如下所示:

   

今天博客中所涉及的Demo依然会在github上进行分享,分享地址如下。

github源码分享地址:https://github.com/lizelu/DataStruct-Swift/tree/master/AllKindsOfSortForiOS


iOS可视化动态绘制八种排序过程(Swift版)的更多相关文章

  1. iOS可视化动态绘制八种排序过程

    前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序.选择排序.插入排序.希尔排序.堆排序.归并排序以及快速排序.俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客 ...

  2. iOS可视化动态绘制连通图

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  3. iOS可视化动态绘制连通图(Swift版)

    上篇博客<iOS可视化动态绘制八种排序过程>可视化了一下一些排序的过程,本篇博客就来聊聊图的东西.在之前的博客中详细的讲过图的相关内容,比如<图的物理存储结构与深搜.广搜>.当 ...

  4. Java 的八种排序算法

    Java 的八种排序算法 这个世界,需要遗忘的太多. 背景:工作三年,算法一问三不知. 一.八种排序算法 直接插入排序.希尔排序.简单选择排序.堆排序.冒泡排序.快速排序.归并排序和基数排序. 二.算 ...

  5. 关东升的iOS实战系列图书 《iOS实战:入门与提高卷(Swift版)》已经上市

             承蒙广大读者的厚爱我的 <iOS实战:入门与提高卷(Swift版)>京东上市了,欢迎广大读者提出宝贵意见.http://item.jd.com/11766718.html ...

  6. Java实现八种排序算法(代码详细解释)

    经过一个多星期的学习.收集.整理,又对数据结构的八大排序算法进行了一个回顾,在测试过程中也遇到了很多问题,解决了很多问题.代码全都是经过小弟运行的,如果有问题,希望能给小弟提出来,共同进步. 参考:数 ...

  7. 八种排序算法--java实现(转)

    (转:http://blog.csdn.net/without0815/article/details/7697916) 8种排序之间的关系: 1, 直接插入排序 (1)基本思想:在要排序的一组数中, ...

  8. 秒杀9种排序算法(JavaScript版)

    一:你必须知道的 1> JS原型 2> 排序中的有序区和无序区 3> 二叉树的基本知识 如果你不知道上面三个东西,还是去复习一下吧,否则,看下面的东西有点吃力. 二:封装丑陋的原型方 ...

  9. java实现八种排序算法并测试速度(详细)

    算法代码: /** * Created by CLY on 2017/3/17. */ package pers.cly.sorting; /** * 排序工具类,里面包含各种排序方法 */ publ ...

随机推荐

  1. 10 months then free? 10个月,然后自由

    Parole board to recommend Oscar Pistorius be released in August 假释委员会将建议奥斯卡·皮斯托瑞斯在8月份被释放 By Don Melv ...

  2. C语言 数组 列优先 实现

    C语言数组结构列优先顺序存储的实现 (GCC编译). 从行优先转换为列优先存储方式, 与行优先相比, 不同之处在于改变了数组维界基址的先后顺序, 从而改变了映像函数常量基址. /** * @brief ...

  3. 高性能MySql进化论【转】

    高性能MySql进化论(十二):Mysql中分区表的使用总结 http://binary.duapp.com/category/sql 当数据量非常大时(表的容量到达GB或者是TB),如果仍然采用索引 ...

  4. shiro 返回json字符串 + 自定义filter

    前言: 在前后端分离的项目中, 在使用shiro的时候, 我们绝大部分时候, 并不想让浏览器跳转到那个页面去, 而是告诉前端, 你没有登录, 或者没有访问权限. 那这时候, 我们就需要返回json字符 ...

  5. java项目配置域名(tomcat直接配置 or 使用nginx反向代理)

    一:  tomcat直接配置域名:https://blog.csdn.net/qq_36330228/article/details/78516160 二: 使用nginx进行反向代理 tomcat服 ...

  6. PostgreSQL10.5安装详细步骤(Win10)

    一.PostgreSQL安装: 作者:qq2648008726 来源:CSDN 原文:https://blog.csdn.net/u012325865/article/details/81951916 ...

  7. RabbitMQ Queue中Arguments属性参数过期队列,过期消息,超时队列的声明

    开发十年,就只剩下这套Java开发体系了 >>>   创建队列时指定参数 队列属性:x-message-ttl 可以控制被publish到queue中的message 被丢弃前能够存 ...

  8. vue学习五之VueCLi

    概念 通俗的说,Vue CLI是我们创建大型项目时的脚手架,所谓脚手架,就是帮助我们建设好了建造大厦的所需模板,建设者只需往模板里面填入实质内容,即可完成大厦的建设,对于程序开发来说,脚手架使程序员只 ...

  9. 用 Love2D 实现法线贴图的例程(到最新版本 0.10.1)

    用 Love2D 实现法线贴图的例程(到最新版本 0.10.1) 概述 一般来说, 复杂的光照模型会被用在 3D 游戏中, 以产生逼真的效果, 不过也有些开发者研究出一些代码可以在 2D 游戏中使用这 ...

  10. NOIP2018游记(更新完毕)

    10.13 初赛 Day -1 考前 这一次的考场从暗♂德华兴改到了长沙市一中,一进去:我一看,考场在哪???这一中比长郡大了好多,而且连指示牌都没有,这时碰见了谢总,谢总告诉我们在第二教学楼.路上还 ...