一、小序
我們先講解一道演算法題目:陣列中有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)的排序,例如快速排序、歸併排序。
二、動畫演示【其實上面例子更加明了】
經典演算法 計數排序
概述 計數排序是乙個非基於比較的排序演算法,該演算法於1954年由 harold h.seward 提出。它的優勢在於在對一定範圍內的集合排序時,它的複雜度為 n k 其中k是元素的範圍 快於任何比較排序演算法。計數排序本質上是通過計算無序集合中元素出現的次數來決定集合應該如何排序的。例如乙個陣列,...
經典演算法 計數排序演算法
計數排序 該演算法於1954年由 harold h.seward 提出。它是乙個不需要比較的,類似於桶排序的線性時間排序演算法。該演算法是對已知數量範圍的陣列進行排序。其時間複雜度為o n 適用於小範圍集合的排序。計數排序是用來排序0到100之間的數字的最 好的演算法。比如100萬學生參加高考,我們...
經典排序 計數排序
找到待排序列中最大最小的元素,然後以此確定臨時空間的大小,在臨時空間中,以待排序列組中元素的大小為下標,該元素出現的次數為該下標對應的元素,根據臨時空間的統計結果,重新對元素進行 把temp裡的資料 到原空間裡 for i 0 i free temp void count sort int arr,...