上一篇說了桶排序,此次說一下桶排序的擴展-基數排序。數組
要說基數排序的話,那就必須得說一下兩個概念。「基」和「桶」app
基:基數排序裏的「基」是什麼意思呢?基的英文是radix,直接翻譯是進制的意思,在基數排序裏,指的是數字的位,好比數字123,這裏1是百位的基,2是十位的基,3是個位的基翻譯
桶:桶就是上一篇桶排序中的那個桶,表示一個區間內的值。code
那麼基數排序是如何進行排序的呢?好比,有一組數字[9, 11, 31, 27, 50],使用基數排序的話,它先對個位數 [9,1,1,7,0]進行排序,再對十位進行排序,對個位和十位都排好序了,那整組數字就是排好序的了。排序
以個位數爲依據it
根據個位定位丟進哪一個桶內class
遍歷array,元素放入對應的桶內擴展
遍歷桶,輸出元素到array循環
以十位爲依據遍歷
根據十位定位應該丟進哪一個桶
遍歷桶,輸出排好序的元素
僞代碼以下:
for 每一個基:
第一步:遍歷要排序的集合arr,放入對應的桶bucket
第二步:把桶裏的元素放回arr
程序代碼以下:
def radixSort(array): # 1.獲取數組內的最大值、初始化基 maxNumber = max(array) radix = 1 # 2.循環排序每一個基 sortedArray = [] while maxNumber // radix > 0: # 1.初始化桶數組,桶數組裏有十個桶,每一個桶是一個集合 bucketArray = [[] for i in range(10)] # 2.全部元素丟進對應的桶 for i in array: # 元素屬於哪一個桶 bucketIndex = i / radix % 10 bucket = bucketArray[bucketIndex] bucket.append(i) # 3.排好radix位的有序集合,返回給while外定義的集合來接收 sortedArray = [] for bucket in bucketArray: for i in bucket: sortedArray.append(i) # 4.下一次遍歷 更高一位 radix = radix * 10 return sortedArray if __name__ == '__main__': array = [9, 11, 31, 27, 50] sortedAray = radixSort(array) print(sortedAray)
輸出結果:
[9, 11, 27, 31, 50] Process finished with exit code 0
時間複雜度 :O(10 + r * (10 + n + n) ),其中,r是radix,若是最大數是1000,那n就是4
前面的10影響很小,能夠去掉,複雜度O(r * (10 + n + n) )
r * (10 + n + n)內的10,在n很大的時候,也能夠直接忽略,複雜度O(r * (n + n) )=O(2*rn)
一樣當n很大的時候,n和2*rn是一個意義的,去掉係數,時間複雜度是O(n)
因此,能夠近似的認爲,基數排序的時間複雜度是O(n)
空間複雜度:O(n + rd)
傳入的集合中元素個數爲n,r是位數(桶的個數),d是每一位的個數(桶內的元素個數)
基數排序不能處理負數(固然數組內所有加上一個正常數,使數組內所有是正數,基排好後,再減去這個正常數。這樣也能夠的,可是,代價有點大)
適合數據比較集中的場景,若是數據跨度很大,會形成取「基」的成本很高。