上篇博客咱們主要聊了比較高效的歸併排序算法,本篇博客咱們就來介紹另外一種高效的排序算法:快速排序。快速排序的思想與歸併排序相似,都是採用分而治之的方式進行排序的。快速排序的思想主要是取出無序序列中第一個值,而後經過比較將比該值小的元素放到該值的前方,將比該值大的元素放在該值的後方。這樣一來該值前方的數據都要比該值小,該值後方的數據都要比該值大。而後再次對前半部分和後邊半部分無序的數列進行上述操做,這樣不斷的操做,無序的序列的規模不斷被縮小。等問題的規模被縮小到必定程度後,咱們的序列就變的有序了。git
以前咱們說過,當一個問題能夠被分紅一些相同的子問題時,咱們就可使用遞歸來操做。因此在快速排序的過程當中,咱們是經過遞歸的方式將問題規模逐漸減少,知道序列爲序爲止。本篇博客將會給出這一過程,根據示意圖,給出相應的代碼實現。github
1、將無序數組進行拆分算法
在本篇博客,咱們先聊一聊若是將大的問題拆分紅一些相同的子問題。咱們須要對須要排序的數組進行拆分,從無序序列中取出一個值,而後經過比較,將比該值大的放在該值的後方,比該值小的,放在該值的前方。本部分,咱們將給出相應的示意圖以及代碼實現。數組
1.拆分示意圖函數
下方就是咱們上述過程的示意圖。也是快速排序第一輪排序的過程。首先將無序數組中的第一個值進行暫存(temp = 62),通過下述步驟,咱們會將那些比62小的元素放到62的前面,比62大的元素放到後邊。low負責遍歷前半部分,將前半部分大於62的值放到後邊,而high負責遍歷後半部分,將後半部分小於62的值放前邊。具體步驟以下所示。測試
2.代碼實現ui
根據上述示意圖,咱們能夠給出相應的代碼實現。若是上述的示意圖理解了,看下方代碼的實現是比較簡單的。partition()函數就負責將一個無序的數組轉變的以第一個值爲準,較小的值放在該值的前邊,較大的放在該值的後邊。以下所示。spa
2、快速排序對象
實現完拆分方法後,咱們就該實現快速排序的代碼了。上面的代碼是快排的核心,接下來作的事情是調用上述的函數將無序數組進行拆分,而後再調用上述函數將先後無序的小數組進行拆分,依次執行下去,咱們的數組就是有序的了。其實就是一個遞歸的過程。下方的quickSort()就是這個過程。首先將無需數組調用partition()方法進行拆分,而後再次調用quickSort()方法執行前半部分,一樣的調用quickSort()方法執行後半部分。代碼以下所示。blog
定義完快速排序的核心方法後,接下來就是使用了。下方的QuickSort就是相應的快速排序類,QuickSort仍是要遵循SortType這個排序協議的,而sort()方法則是該協議中定義的對外調用的接口。具體代碼以下所示。
3、測試用例
用我QuickSort類遵循了SortType方法,咱們依然可使用以前的測試用例。下方就是咱們的測試用例,與以前使用的一直,只不過須要將QuickSort這個類的對象傳給咱們的測試函數便可,以下所示:
本篇博客快速排序的運行結果以下:
本篇博客對堆排序的介紹就先到這兒,下篇博客咱們將會介紹「基數排序」的詳細內容。本篇博客的相關代碼依然會在github上進行分享,下方是github分享地址,以下所示:
github代碼分享地址:https://github.com/lizelu/DataStruct-Swift/tree/master/AllKindsOfSort