【算法導論】【排序】—— 計數排序(counting sort)

計數排序的特色:python

  • 須要額外的數組以存儲:
    • 中間過程數據(記爲數組 C),數組 C 的下標是待排序序列的元素值,下標對應的值爲出現的次數;
    • 排序後的序列(記爲 B),計數排序僅獲取原始待排序序列的值,對原始序列不作 in-place 處理;
  • 計數排序首先統計原始序列各個數(按順序,也就是索引)出現的次數,須要獲取原始序列的最大值,做爲計數數組的區間長度;
def counting_sort(A, k):
    # k = max(A) + 1
    C = [0]*k
    for i in A:                # 統計 A 中各個數出現的次數,C 的下標爲 A 的元素值
        C[i] += 1
    for i in range(1, len(C)):            
        C[i] += C[i-1]         # 不斷累加
    # print('C: ', C) # C 的下標爲 A 的元素值, C 下標對應的值爲此元素值應在排序後的序列中的位置
    B = [0]*(len(A)+1)
    for i in A[::-1]:
        B[C[i]] = i            # C 下標對應的值爲此元素值應在排序後的序列中的位置
        C[i] -= 1              # 原始序列中重複出現的數字在排序過程當中不斷地向前排;
    return B

if __name__ == '__main__':
    A = [2, 5, 3, 0, 2, 3, 0, 3]
    k = max(A)+1
    B = counting_sort(A, k)
    print('B: ', B)
相關文章
相關標籤/搜索