排序演算法如果是穩定的,那麼從乙個鍵上排序,然後再從另乙個鍵上排序,前乙個鍵排序的結果可以為後乙個鍵排序所用。基數排序就是這樣,先按低位排序,逐次按高位排序,低位排序後元素的順序在高位也相同時是不會改變的。基數排序是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。
將所有待比較數值(正整數)統一為同樣的數字長度,數字較短的數前面補零。然後,從最低位開始,依次進行一次排序。這樣從最低位排序一直到最高位排序完成以後,數列就變成乙個有序序列。基數排序的方式可以採用 lsd(least significant digital)或 msd(most significant digital),lsd 的排序方式由鍵值的最右邊開始,而 msd 則相反,由鍵值的最左邊開始。
這裡我們按照個位數排序,待排序列為:,我們採取lsd方式對待排序列排序,效果如下:
#獲得最大數的位數的值
max_data = max(input_list)
bits_num = 0
while max_data:
bits_num += 1
max_data //= 10
return bits_num
def digit(num, d):
#取數num上的第d(從右往左第d位)位數字
p = 1
while d > 1:
d -= 1
p *= 10
return num // p % 10
if len(input_list) == 0:
return
sorted_list = input_list
length = len(sorted_list)
bucket = [0] * length
for d in range(1, maxbit(sorted_list) + 1):
count = [0] * 10
for i in range(0, length):
count[digit(sorted_list[i], d)] += 1
#count[i]表示針對所有數的第d位數,小於等於i的數的個數是count[i]
for i in range(1, 10):
count[i] += count[i - 1]
#針對所有數,按第d位數從小到大放入bucket裡
其中,d代表陣列元素最高位數,n代表元素個數
這個時間複雜度比較好計算:count * length;其中 count 為陣列元素最高位數,length為元素個數;所以時間複雜度:o(n * d)
空間複雜度是使用了兩個臨時的陣列:10 + length;所以空間複雜度:o(n)。
在基數排序過程中,每次都是將當前位數上相同數值的元素統一「裝桶」,並不需要交換位置。所以基數排序是穩定的演算法。
演算法 排序之基數排序
基數排序也是穩定的內排序。因為它的實現是基於內部使用了穩定的排序實現的所以基數排序整體是穩定的,而且時間複雜度為o n 舉個例子 現在我們將一些3 多 位數排序,如果你說直接判斷就好的話,那你就太天真了,因為那就又變成看o nlgn 或者o n 如何能降低時間複雜度變成o n 呢?那就要使用線性時間...
排序演算法之基數排序
首先從多排序碼排序開始介紹基數排序。以撲克牌排序為例。每張撲克牌有兩個 排序碼 花色和面值。其有序關係為 如果把所有撲克牌排成以下次序 2,a,2,a,2,a,2,a 這就是多排序碼排序。排序後形成的有序序列叫做字典有序序列。一般情況下,假定有乙個n個元素的序列 v 0,v1 vn 1 且每個元素v...
排序演算法之基數排序
如果我們要排序的資料具有多個關鍵字域,那就可以採用基數排序的方法了。基數排序的主要思想是 假如參加排序的元素最高具有d位,有的數沒有d位那麼多,則在其欠缺的高位補0,將元素先按最低位 設最右邊的位為最低位 的值進行排序,然後按次低位進行排序.最後進行最高位的排序。基數排序如果想達到理想的目的,必須滿...