我們之前提到過計數排序,計數排序在某些情況下並不太適合,例如元素範圍太大的情況,桶排序算是對於計數排序的一種改進,桶排序首先根據元素大小放置到不同的桶中,然後在對每乙個桶內元素進行排序。
例如陣列[29,25,3,49,9,37,21,43],可以以10為區間來存放元素,具體操作如下圖:
關於「桶」這個結構怎麼實現,在python裡面可以用二位陣列來表示[ [ ], [ ], [ ] ....],總得來說桶排序步驟:
1 . 建桶
2. 元素存放到桶裡面
3. 桶內元素進行排序(第二步和第三步可以合併到一起,因為初始的桶為空是有序的,每次只需執行一次插入即可保持有序
4. 依次取出每個桶內元素
時間複雜度:平均o(n+k), 最壞o(n^2 * k)都放到乙個桶裡面了
空間複雜度:o(nk)
def bucket_sort(nums, buckets):
"""桶排序
:param nums: 無序陣列
:param buckets: 桶個數
:return: 有序陣列
"""bucket = [ for x in range(buckets)] # 建立空桶
num = max(nums) - min(nums) + 1
l = num // buckets + 1 if num % buckets else num // buckets # 計算每個桶大小
for i in nums:
bucket_num = i // l # 計算元素應該放入到哪乙個桶裡面
# 維護桶內元素有序。
# 因為之前的桶內是有序的,插入乙個新的元素可以使用插入排序繼續保持桶內有序
tmp = i
j = len(bucket[bucket_num]) - 2
while j >= 0 and bucket[bucket_num][j] > tmp: # 執行插入操作
bucket[bucket_num][j + 1] = bucket[bucket_num][j]
j -= 1
bucket[bucket_num][j+1] = tmp
res =
# 依次取出桶內元素
for i in bucket:
res.extend(i)
return res
常用排序演算法 基數排序(桶排序)
本文以最大為3位數字為例,並可以對負數進行排序 include using namespace std 獲取第d 1位的數字 int get digit int x,int d return abs x a d 10 void lsd sort int arr,int left,int right,...
排序演算法 桶排序
桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序並不...
排序演算法 桶排序
2009 12 02 12 01 2817人閱讀 桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均...