什麼是桶排序?

2022-09-02 09:36:09 字數 1979 閱讀 2802

首先說一下桶排序的桶是什麼概念,這裡的「桶」是乙個區間範圍,裡面可以承載乙個或多個元素。桶排序的第一步就是確定桶的個數和區間。具體的建立多少個桶、每個桶的區間範圍是多少,有不同的方式,我們這裡使用桶的數量等於原始數列的元素的數量(為什麼等於數列的數量,後面會講到)。除了最後的乙個桶只包含最大值,其他的值分散在其他桶裡。

區間跨度 = (最大值-最小值)/ (桶的數量 - 1)

第二步是把原始數列的元素放入桶中

第三步是桶內的元素進行排序

第四步就是遍歷所有的桶,輸出元素

0.5,0.84,2.18,3.25,4.5

上面是思路,具體**如下:

def sortbucket(array):

max = array[0]

min = array[0]

for i in array:

if max < i:

max = i

if min > i:

min = i

# 1.初始化桶

bucketnumber = len(array)

bucketarray =

for i in range(bucketnumber):

t =

# 2.數列的元素放入桶

for i in array:

index = int((i - min) / (max - min) * (bucketnumber - 1))

# 3.桶內的元素排序

for i in array:

bucketarray[i].sort()

# 4.返回排好序的集合

sortedarray =

for bucket in bucketarray:

for element in bucket:

return sortedarray

if __name__ == '__main__':

array = [3, 3, 3, 7, 9, 1, 7, 1, 3, 4]

bucketarray = sortbucket(array)

print(bucketarray)

輸出結果

[1, 1, 3, 3, 3, 3, 4, 7, 7, 9]

process finished with exit code 0

這裡有乙個不是非常明白的地方,就是 第二步中數列元素放入桶,計算index的演算法:當前差值/全域性差值*數列的長度減一(按照比例定位),在網上也看了其他的文章,有的文章裡計算index的演算法直接是:當前差值/數列長度。然後,我代入了幾個元素,發現,還是前者的演算法計算出來的下標更加精確。

假設原始數列的元素個數是n,桶的數量的m,平均每個桶內的元素數量的n/m

求最值,計算量n

初始化桶,計算量m

數列的元素放入桶,計算量n

每個桶內元素排序,由於使用了o(n log n)演算法,計算量是m(n/m * log n/m)=n(log n/m)

最後返回排好序的集合,計算量是n

綜上所述,計算量是 3n+m+ n(log n - log m),去掉係數o(n+m+n(log n - log m))

假如m=n,則時間複雜度o(n+m),近似o(n)

空間複雜度:很明顯是原始陣列的空間n 加上 桶的空間m,是n+m

假如元素分布極不均衡,比如全部在最後乙個桶內,則此時的時間複雜度就退化到了o(n*log n),並且空間複雜度浪費了很多,因為建立了很多無用的空桶

動畫 什麼是桶排序?

桶排序和計數排序一樣,不受o nlogn 時間複雜度下限的影響,它將待排序序列通過遍歷方式分到有限數量的桶中,然後每個桶被單獨地排序,不管是使用同乙個比較類排序演算法或者使用不同的排序演算法,或者還是遞迴地使用桶排序。桶排序可以通過比較方式實現,也可以通過非比較方式實現。通過比較方式的桶排序分為4步...

什麼是計數排序和桶排序

概念 計數排序演算法不是基於元素比較,而是利用陣列下標來確定元素的正確位置。設計乙個統計陣列,將原始資料的次數統計一下。特點 待排序的資料作為陣列的下標存放,陣列的值是該下標資料出現的次數。這樣遍歷一遍這個陣列就可以有序的取出下標值,即原資料。可以以數列的最小值作為偏移量,比如原始數列的最小值是90...

排序 桶排序

首先,桶排序是一種簡單並且執行快的一種排序。第一步,對五個數進行排序。程式如下 include using namespace std int main 首先對陣列進行歸零 for int j 1 j 5 j 將輸入的數的個數存入陣列中。for int k 1 k 10 k 執行原理 桶排序,就是先...