計數排序的python實現

無論是歸併排序、堆排序或是快速排序,它們都是通過元素之間的比較進行排序,所以在這些排序方法的執行過程中,數組自身的性質(數組中各元素的排列順序)會直接影響到時間或者內存成本的大小。這類排序算法稱爲比較排序,這些排序算法的下界都是nlgnnlgn
計數排序不是比較排序,它的執行效果不依賴於願數組本身元素的排列。
計數排序的思想是假設大小爲nn的數組中的所有元素都是在區間[0,k)[0,k)上的整數,這樣對於每一個元素xx,只要確定數組中小於xx的元素個數,我們就可以將xx放到正確的排序位置上。例如確定了有10個元素小於xx,這樣的話,當輸出結果序列時(從小到大排列的數組),我們就可以確定xx一定是在結果序列的第十一個位置。當然,如果有元素的值相同的話,符號上的細節處要略作修改,不能出現多個相同的值出現在同一個位置上。
對於一個有nn個元素的數組list0list0,對其進行計數排序時,需要一個對其元素數目進行記錄的數組list1list1以及一個相同大小的輸出數組list2list2
具體的python實現如下。

#待排序數組爲l0,數組元素值域爲[0,k)
def counting_sort(l0,k):
   #初始化結果數組l2,記錄數組l1
    l1=[0]*k
    l2=[-1]*len(l0)
    #遍歷原數組,使用l1記錄所有元素的個數,將元素值爲t的個數記錄在l1[t]中
    for i in range(len(l0)):
        l1[l0[i]]=l1[l0[i]]+1
    #累加得到原數組中小於t的元素個數
    for j in range(1,k,1):
        l1[j]=l1[j]+l1[j-1]
    #根據l1中得到的數據(小於t的元素個數)將每個元素放到結果數組l2中正確的位置上
    for i in range(len(l0)-1,-1,-1):
        #從原數組的最後向前循環可以保證:具有相同值的元素在輸出數組中的相對位置與在元素組中一樣
        l2[l1[l0[i]]-1]=l0[i]
        #個數減一,下一個相同的元素往前排
        l1[l0[i]]=l1[l0[i]]-1
    return l2

我借用《算法導論》裏的例子來解釋這個程序的運行。對於要排序的數組l0=[2,5,3,0,2,3,0,3]l0=[2,5,3,0,2,3,0,3],我們還需要知道的一個值就是所有元素的值域[0,k)[0,k),顯然這裏k=6k=6
下面來展示下函數運行過程中,變量l1l1l2l2變化情況。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
對於數組l0l0,當k=Θ(n)k=Θ(n)時,排序的運行時間爲Θ(n)Θ(n)。是一個很優秀的算法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章