1. 程式人生 > >八大排序算法之基數排序

八大排序算法之基數排序

輸出 bsp 交換 and del 當前 print [] radixsort

設計思想

  它是根據關鍵字中各位的值,通過對排序的N個元素進行若幹趟“分配”與“收集”來實現排序的。它不要比較關鍵字的大小。

  假設:R {50, 123, 543, 187, 49, 30, 0, 2, 11, 100}

  任何一個阿拉伯數,它的各個位數上的基數都是以0~9來表示的。所以我們不妨把0~9視為10個桶。 我們先根據序列的個位數的數字來進行分類,將其分到指定的桶中。例如:R[0] = 50,個位數上是0,將這個數存入編號為0的桶中。

    技術分享

  分類後,我們在從各個桶中,將這些數按照從編號0到編號9的順序依次將所有數取出來。這時,得到的序列就是個位數上呈遞增趨勢的序列。 按照個位數排序: {50, 30, 0, 100, 11, 2, 123, 543, 187, 49}。接下來,可以對十位數、百位數也按照這種方法進行排序,最後就能得到排序完成的序列。

代碼實現

import math
def get_number(num):
    import random
    lst = []
    i = 0
    while i < num:
        lst.append(random.randint(0,100))
        i += 1
    return lst

def radixsort(lst,radix=10):
    k = int(math.ceil(math.log(max(lst),radix)))
    bucket = [[] for i in range(radix)]
    for i in
range(1,k+1): for j in lst: bucket[j//radix**(i-1) % (radix**i)].append(j) del lst[:] for z in bucket: lst += z del z[:] return lst a = get_number(10) print("排序之前:",a) b = radixsort(a) print("排序之後:",b) ########輸出結果########### 排序之前: [2, 4, 26, 46, 90, 16, 80, 36, 37, 72] 排序之後: [
2, 4, 16, 26, 36, 37, 46, 72, 80, 90]

性能分析

  時間復雜度:通過上文可知,假設在基數排序中,r為基數,d為位數。則基數排序的時間復雜度為O(d(n+r))。我們可以看出,基數排序的效率和初始序列是否有序沒有關聯。

  空間復雜度:在基數排序過程中,對於任何位數上的基數進行“裝桶”操作時,都需要n+r個臨時空間。

  算法穩定:在基數排序過程中,每次都是將當前位數上相同數值的元素統一“裝桶”,並不需要交換位置。所以基數排序是穩定的算法。

八大排序算法之基數排序