前面几篇博客都是关于排序的,在以前陆陆续续发布的博客中,咱们前后介绍了冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序以及快速排序。俗话说的好,作事儿要有始有终,本篇博客就算是对以前那几篇博客的总结了。而本篇博客的示例Demo也是在以前那些博客Demo的基础上作的,也算是集成了各类排序的方法,而后给出了可视化的解决方案。今天博客的内容仍是比较有趣的。html
由于本猿是作iOS开发的,因此就使用iOS相关的组件来表示上述各类排序的过程。使用可视化方式来感觉一下上述这些排序方法的异同。本篇博客所使用的相关的排序代码都是来自于以前的博客。由于咱们在以前实现各类排序Demo时,咱们定义了相应的排序接口SortType,因此上述的七种排序对外的调用方式是一致的,因此在此基础上给出相应排序的可视化解决方案并不困难。本篇博客就会给出其相应的扩展过程。git
若是你想对上述7中排序进行详细的了解,请移步与以前的博客《冒泡排序、插入排序、希尔排序、选择排序》、《堆排序》、《归并排序》、《快速排序》、《基数排序》。废话少说,开始今天的博客。github
1、可视化解决方案综述设计模式
1.交互UI综述数组
在本篇博客的第一部分咱们先来总体的看一下咱们Demo的功能。下方就是咱们今天博客中的Demo的交互示意图。上方的输入框能够输入要排序元素的个数,下方输入的是300。程序会根据你输入的个数来随机生成数据,你输入300,就会随机生成300个数据提供排序使用。下方的SegmentControl能够选择不一样的排序方式,本篇博客给出了7中经常使用的排序方式,选择完排序方式后能够点击右上方的排序按钮进行相应的排序。闭包
下方显示的不一样颜色的颜色条就是咱们要排序的东西,咱们会按照从小到大的方式对这些色条进行排序。左图中是未排序的状态,右图中是已经排序的状态。咱们上面随机生成的数据反应到色条上就是色条的高度,咱们按照色条的高度进行从小到大的排序。下方会给出每种排序的介绍。post
二、部分核心代码实现url
为了实现今天的Demo,咱们须要对以前咱们实现的那一些列的排序的方法进行扩展。由于咱们以前在实现各类排序时,咱们先定义了SortType接口,依据“开放封闭原则”,咱们能够为各类排序的类建立一个“简单工厂”以供咱们的视图层使用。关于设计模式更多以及更详细的内容,能够移步以前发布的设计模式系列博客《设计模式Swift版》。spa
上方就是为各类Sort类提供的“简单工厂”。上面这个简单工厂在视图控制器中点击SegmentControl时会使用,由于咱们在选择不一样排序类的时候须要使用不一样的排序对象。下方就是咱们视图控制器对“简单工厂”的调用,固然咱们全部排序类都有父类,你也可使用“工厂方法”来建立相应的对象,在此就不作过多赘述了。线程
下方代码段就是点击SegmentControl要调用的方法,其中从“简单工厂”中获取到相应排序方式的对象后,而后在设置相应的闭包回调。
2、冒泡排序
接下来咱们来逐一看一下每种排序的具体效果。下方就是冒泡排序的效果,由于冒泡排序的时间复杂度是O(n^2)的,因此咱们先设置元素个数是80, 若是太大的话会比较慢。由于咱们在排序步骤结果输出时,每进行一次交换操做或者比较操做让排序线程休眠0.001秒,便于咱们观察整个排序过程。
从下方这个动图上咱们不难看出冒泡的整个过程,较小的数据从右往左以此往外冒。下方这个效果仍是比较直观的,整个冒泡过程就是从后往前比较,若是后边的数要比前边的小就交换。冒泡过程以下所示:
3、选择排序
选择排序的时间复杂度也是O(n^2)。下方是“选择排序”的可视化过程,选择排序的过程就是从无序序列中找出最小的那个值放到有序序列中最后方。不断执行这个过程,咱们的序列就是有序的了。下方就是选择排序的整个过程,元素的个数是80.
4、插入排序
插入排序的复杂度与上述选择排序的时间复杂度同样,都是O(n^2)。下方就是插入排序的运行结果。插入排序是从无序序列中取出第一个值,而后插入到前方有序序列中相应的位置。每次插入后,有序序列就会增长1,无序序列就会减小1。下方就是插入排序的过程,以下所示:
5、希尔排序
希尔排序的效率要高一些,其时间复杂度是O(n^(3/2))。下方就是希尔排序的具体执行步骤,希尔排序又称为缩小增量排序。该排序方式是插入排序的升级版,等增量缩小到1时,咱们的序列就是有序的了。下方就是希尔排序的具体执行步骤,以下所示:
6、堆排序
堆排序比希尔排序更为高效,其时间复杂度为O(nlog2n)。下方的“堆排序”是根据大顶堆来进行排序的,大顶堆第一个值是序列中最大的,咱们能够利用这一点获取无序序列中最大的那个值。首先咱们将序列调整为大顶堆,而后把大顶堆的第一个值与最后一个值进行交换,而后再将剩下的序列调整成大顶堆,而后进行下一轮的替换。
7、归并排序
归并排序的时间复杂度也是O(nlog2n)。归并排序就是将无序数组拆分红多个只有一个元素的数组,而后进行两两合并。在合并的过程当中将两个数组中的元素进行比较,将较小的放在前方,两个有序的数组合并后依然是有序的,而后再次进行两两合并,直到合并成一个数组为止。下方就是归并排序的执行顺序,从执行过程当中,咱们能够清楚的看到在排序过程当中被分割的小的有序序列。归并排序的执行过程以下所示:
8、快速排序
快速排序的时间复杂度为O(nlog2n)。下方是快速排序的执行步骤,快速排序是利用里分治法的思想。从无序序列中取出一个值,比该值大的放在前方,比该值小的放在后方。而后递归执行前半部分和后半部分依次递归下去,咱们的序列就是有序的了。
9、基数排序
下方是基数排序的运行效果,咱们先输入1000个元素,生成1000个随机数,选择基数排序。以下所示:
10、上述排序的比较
关于上述排序的比较,在此就不作过多赘述了,就引用“维基百科”中的表格来讲明吧,以下所示:
今天博客中所涉及的Demo依然会在github上进行分享,分享地址以下。
github源码分享地址:https://github.com/lizelu/DataStruct-Swift/tree/master/AllKindsOfSortForiOS