基數排序
此算法特性
此算法適用場景
代碼實現
def RadixSort(arr):
max_num = max(arr)
exp = 1
resval = arr[:]
while max_num // exp >0:
output_arr = [0]*len(arr)
buckets_arr = [0]*10
for i in range(len(arr)): # 數據出現的次數裝入到桶中
buckets_arr[(resval[i]//exp)%10] +=1
# print('數據裝入到桶中:',buckets_arr) # 查看桶信息
for j in range(1,10): # 計算前面的元素出現多少次(包括此元素)
buckets_arr[j] += buckets_arr[j-1]
#print('計算前面的元素出現多少次:',buckets_arr) # 查看排序信息
'''
reves[k] 是 reves的值
resval[k]//exp 是 獲得當前整數.
(resval[k]//exp)%10 是 獲得當前的余數
buckets_arr[(resval[k]//exp)%10] 是
'''
for k in range(len(resval)-1,-1,-1): # 進行排序
output_arr[buckets_arr[(resval[k]//exp)%10] - 1] = resval[k] # 第幾名.如果是第一名,那么是arr[0],所以需要減去個1
buckets_arr[(resval[k]//exp)%10] -= 1 #
resval = output_arr
exp = exp *10
return resval
#
# 算法結束.
# ------------------
# 以下是數據測試類,用於測試算法正確性,非排序算法本身函數.
# 可以刪除TestDate類,手動填入數據測試.
#
import unittest
import random
class TestData(unittest.TestCase):
def create_data(self,num_start,num_end,num_length): # 生成整數
return [random.randint(num_start,num_end) for i in range(num_length)]
def test_case1(self):
numlist = self.create_data(1,20,5)
print('未排序數據:{}'.format(numlist))
print(RadixSort(numlist))
print('\n'*1)
def test_case2(self):
numlist = self.create_data(99,375,20)
print('未排序數據:{}'.format(numlist))
print(RadixSort(numlist))
print('\n'*1)
def test_case3(self):
numlist = self.create_data(1,8888,5)
print('未排序數據:{}'.format(numlist))
print(RadixSort(numlist))
print('\n'*1)
def test_case4(self): # 基數遇到負數會出現排序錯誤
numlist = self.create_data(-122,222,5)
print('未排序數據:{}'.format(numlist))
print(RadixSort(numlist))
print('\n'*1)
if __name__ == "__main__":
unittest.main() # 調用測試數據