Swift經典排序算法-計數排序法

一、小序

我們先講解一道算法題目:數組中有10個隨機數值,數值取值範圍爲從0到5,我們如何用最快的速度把這10個整數從小到大進行排序。

首先你會想到我們之前學的快速排序這個算法,因爲快速排序算法的時間複雜度只爲O(nlogn)。其實這種方法還是不夠快,那有沒有比快速排序算法更快的排序方法呢?你心中不免疑慮 ???」時間複雜度爲O(nlogn)的快速排序??不是最快的???「

讓我們先來回顧一下經典的排序算法,無論是歸併排序,冒泡排序還是快速排序等等,都是基於元素之間的比較來進行排序的。但是有一種特殊的排序算法叫計數排序,這種排序算法不是基於元素比較,而是利用數組下標來確定元素的正確位置。

在剛纔的題目裏,隨機整數的取值範圍是從0到5,那麼這些整數的值肯定是在0到10這11個數裏面。於是我們可以建立一個長度爲6的數組,數組下標從0到5,元素初始值全爲0,如下所示:
在這裏插入圖片描述

先假設10個隨機整數的值是:【3,5,1,3,2,5,4,1,3,2】

讓我們對這個無序的隨機數組進行遍歷,每一個整數按照其值對號入座,對應數組下標的元素進行加1操作。

例如:第一個整數是3,那麼數組下標爲3的元素加1:
在這裏插入圖片描述
第二個整數是5,那麼數組下標爲5的元素加1:
在這裏插入圖片描述
繼續遍歷數列並修改數組…

最終,數列遍歷完畢時,數組的狀態如下:
在這裏插入圖片描述
數組中的每一個值,代表了數列中對應整數的出現次數。

有了這個統計結果,排序就很簡單了,直接遍歷數組,輸出數組元素大於0的下標值,元素的值是幾,就輸出幾次:

【1、1、2、2、3、3、3、4、5、5】

顯然,這個輸出的數列已經是有序的了。

以上就是計數排序的基本過程,它適用於一定範圍的整數排序。在取值範圍不是很大的情況下,它的性能在某些情況甚至快過那些O(nlogn)的排序,例如快速排序、歸併排序。

二、動畫演示【其實上面例子更加明瞭】
在這裏插入圖片描述

三、代碼實現
在這裏插入圖片描述
更多算法知識,關注微信公衆號:⬇️
在這裏插入圖片描述