前面幾篇博客都是關於排序的,在以前陸陸續續發佈的博客中,咱們前後介紹了冒泡排序、選擇排序、插入排序、希爾排序、堆排序、歸併排序以及快速排序。俗話說的好,作事兒要有始有終,本篇博客就算是對以前那幾篇博客的總結了。而本篇博客的示例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