基數排序(使用Python實現)


基數排序

  

此算法特性

此算法適用場景




代碼實現

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() # 調用測試數據




參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM