桶排序(使用Python實現)


桶排序

  

此算法特性

此算法適用場景




代碼實現

# 桶排序可以看成是基數排序的升級版,計數排序的一個單位是一個數,而桶排序的一個單位是一個區間

def bucktetSort(numList,bucketNum):
    import math
    if len(numList) <=0:
        return numList

    maxNum = max(numList)
    minNum = min(numList)

    bucketLength = len(numList)-1
    bucketSize = ((maxNum - minNum) / bucketLength)  # 根據桶的數量找到每個桶的取值范圍
    buckets = [[] for i in range(bucketLength)]


    for i in range(len(numList)):     # 將各個數分配到各個桶
        # num_bucktes_local界定范圍.只要大於第n個桶,就是在第n+1個桶里.所以是向上取整.
        #比如說 numList = [1,40,50,60,200]. 
        num_bucktes_local =math.ceil((numList[i] - minNum) / bucketSize)-1
        if num_bucktes_local<=0: # 最小值是 == -1 的.
            num_bucktes_local = 0
        buckets[num_bucktes_local].append(numList[i])

    # ---可刪除---
    print('桶的取值范圍是:',bucketSize)
    print('每個桶的藏的寶貝都是:',buckets)
    # ---可刪除---


    for i in range(bucketLength):# 桶內排序,可以使用各種排序方法
        buckets[i].sort()
        
    res = []
    for i in range(len(buckets)):# 分別將各個桶內的數提出來,壓入結果
        res.extend(buckets[i])
    return res

# ---測試數據---
import unittest
class TestData(unittest.TestCase):
    def test_one(self):
        numlist = [1,50.76,75,150,200,321,321,32,992]
        print(bucktetSort(numlist,5),'\n'*2)
    def test_two(self):
        numlist = [-13,321,43,6,9,99,12]
        print(bucktetSort(numlist,5),'\n'*2)
    def test_three(self):
        numlist = [1,50.76,12,321,54,787,43]
        print(bucktetSort(numlist,5),'\n'*2)
# ---測試數據結束---

if __name__ == "__main__":
    unittest.main() # 調用測試數據

參考


免責聲明!

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



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