桶排序
此算法特性
此算法適用場景
代碼實現
# 桶排序可以看成是基數排序的升級版,計數排序的一個單位是一個數,而桶排序的一個單位是一個區間
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() # 調用測試數據