python數據結構學習筆記-2016-11-24-02-基數排序

        12.4 基數排序

         基數排序(radix sort)是一種只適用於數字或字母類型的排序方法,它檢查數字或字母的每一位,將之分類,按照位數的特定順序,來將元素排列。

         12.4.1 算法描述

         以數字爲例,將所有元素按照個位數字分類,分類好後,將個位數字大小排列組合起來,再按照十位數字分類,再按照數字大小排列組合起來,一直到最大數位爲止。


        12.4.2 基本的實現

        基數排序不是一種普適的排序算法,它主要適用於郵政編碼、社會安全號碼或者產品編碼等數據的排序。排序關鍵碼可以是整數、實數或者字符串等,但我們必須要知道序列當中,最大關鍵碼所擁有的位數或者說是字符數,以便於確定按位分類的循環次數。

  • 序列中的每一個關鍵碼的分類,都基於其某一位數字或者字母;
  • 在某一位含相同數字或者字母的關鍵碼,都歸爲一個分類;
  • 分類完成後,按照類別的順序排列,統一分類的關鍵碼以隊列的形式排列,即遵循先進先出的原則。
#-*-coding: utf-8-*-

# 基數排序

from llistqueue import Queue
from array import Array

# numDigits是序列中最大關鍵碼所含的位數
def radixSort(intList, numDigits):
    # 創建10個隊列,用於儲存關鍵碼
    binArray = Array(10)
    for k in range(10):
        binArray[k] = Queue()
    # 從個位開始
    column = 1
    for d in range(numDigits):
        for key in intList:
            digit = (key / column) % 10 # 得出關鍵碼的某一位數字
            binArray[digit].enqueue(key) # 根據數字結果歸類
        i = 0
        for bin in binArray:
            while not bin.isEmpty():
                intList[i] = bin.dequeue()
                i += 1
        column *= 10
         

        12.4.3 效率分析

        假設序列含有n個關鍵碼,最大的關鍵碼含有d個組成部分,每一個組成部分的取值範圍爲0,1, .., k-1。由於是使用鏈表實現的隊列,入隊和出隊的時間複雜度都是O(1)。需要創建k個隊列,需要O(k)的時間複雜度。

        之後將n個關鍵碼歸類,則需要O(n)的時間複雜度,其後的排列也同樣需要O(n)的時間複雜度。而這一過程重複執行d次,則總的時間複雜度爲O(k+dn)。一般來說,k和d在序列給定之後,都是確定的。所以基數排序的時間複雜度是O(n)。

        
        

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