基數排序python實現
基數排序
基數排序(英語:Radix sort)是一種非比較型整數排序算法,其原理是將整數按位數切割成不同的數字,然后按每個位數分別比較。由於整數也可以表達字符串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。
所以基數排序的原理就是,先排元素的最后一位,再排倒數第二位,直到所有位數都排完。這里並不能先排第一位,那樣最后依然是無序。
舉個例子:
第一次排最低位,上邊的序列變成了下面的樣子
從這個圖中也能看出,排序是基於桶排序實現的。
然后就像排最低位一樣,然后再排倒數第二位,再排倒數第三位。注意向桶中放元素的時候一定要按順序放。
具體代碼
這里將列表進行基數排序,默認列表中的元素都是正整數
def radix_sort(s):
"""基數排序"""
i = 0 # 記錄當前正在排拿一位,最低位為1
max_num = max(s) # 最大值
j = len(str(max_num)) # 記錄最大值的位數
while i < j:
bucket_list =[[] for _ in range(10)] #初始化桶數組
for x in s:
bucket_list[int(x / (10**i)) % 10].append(x) # 找到位置放入桶數組
print(bucket_list)
s.clear()
for x in bucket_list: # 放回原序列
for y in x:
s.append(y)
i += 1
if __name__ == '__main__':
a = [334,5,67,345,7,345345,99,4,23,78,45,1,3453,23424]
radix_sort(a)
print(a)
輸出為:
[[], [1], [], [23, 3453], [334, 4, 23424], [5, 345, 345345, 45], [], [67, 7], [78], [99]]
[[1, 4, 5, 7], [], [23, 23424], [334], [345, 345345, 45], [3453], [67], [78], [], [99]]
[[1, 4, 5, 7, 23, 45, 67, 78, 99], [], [], [334, 345, 345345], [23424, 3453], [], [], [], [], []]
[[1, 4, 5, 7, 23, 45, 67, 78, 99, 334, 345], [], [], [23424, 3453], [], [345345], [], [], [], []]
[[1, 4, 5, 7, 23, 45, 67, 78, 99, 334, 345, 3453], [], [23424], [], [345345], [], [], [], [], []]
[[1, 4, 5, 7, 23, 45, 67, 78, 99, 334, 345, 3453, 23424], [], [], [345345], [], [], [], [], [], []]
[1, 4, 5, 7, 23, 45, 67, 78, 99, 334, 345, 3453, 23424, 345345]
總結
基數排序不僅僅只能排正整數,只要通過調整元素放入桶數組的方式就可以排序字符串,浮點數等