前面几篇博客都是关于排序的,在之前陆陆续续发布的博客中,我们先后介绍了冒泡排序、选择排序、插入排序、希尔排序、堆排序、归并排序以及快速排序。俗话说的好,做事儿要善始善终,本篇博客就算是对之前那几篇博客的总结了。而本篇博客的示例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

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4bd157 }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #4bd157 }
span.s1 { }

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

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

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

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

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

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

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

  4. Java 的八种排序算法

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

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

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

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

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

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

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

  8. Java常用的八种排序算法与代码实现

    1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列中. 将第一个数和第二个数排序,然后构成一个有序序列 将第三个数插入进去,构成一个新的有序序列. 对第四个数.第五个数--直 ...

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

    速度测试: (1) 随机数范围:0-100希尔排序: => Time is 38600基数排序: => Time is 53300快速排序: => Time is 46500堆  排 ...

随机推荐

  1. 【原】谈谈对Objective-C中代理模式的误解

    [原]谈谈对Objective-C中代理模式的误解 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这篇文章主要是对代理模式和委托模式进行了对比,个人认为Objective ...

  2. ABP入门系列(2)——通过模板创建MAP版本项目

    一.从官网创建模板项目 进入官网下载模板项目 依次按下图选择: 输入验证码开始下载 下载提示: 二.启动项目 使用VS2015打开项目,还原Nuget包: 设置以Web结尾的项目,设置为启动项目: 打 ...

  3. C#基础篇 - 理解委托和事件

    1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...

  4. 13、零配置Struts2开发

    Convention 插件 从 Struts 2.1 开始, Struts 可以使用 Convention 插件来支持零配置: Convention 插件完全抛弃配置信息, 不仅不需要使用 strut ...

  5. Java程序员:工作还是游戏,是该好好衡量一下了

    前阵子我终于下定决心,删掉了硬盘里所有的游戏. 身为一个程序猿,每天都要和各种新技术打交道,闲暇时间,总还得看一下各大论坛,逛逛博客园啥的,给自己充充电.游戏的话,其实我自小就比较喜欢,可以算是一种兴 ...

  6. cocos2dx调用浏览器打开网址

    安卓端cocos2dx/platform/android路径下CCApplication.h: virtual void openURL(const char* pszUrl); CCApplicat ...

  7. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

  8. 28个你必须知道的HTML5的新特性,技巧以及技术

    崭新新的页面布局 传统的: HTML5: 1. 新的Doctype 尽管使用<!DOCTYPE html>,即使浏览器不懂这句话也会按照标准模式去渲染 2. Figure元素 用<f ...

  9. 微信小程序开发日记——高仿知乎日报(中)

    本人对知乎日报是情有独钟,看我的博客和github就知道了,写了几个不同技术类型的知乎日报APP要做微信小程序首先要对html,css,js有一定的基础,还有对微信小程序的API也要非常熟悉 我将该教 ...

  10. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...