排序演算法(九) 桶排序

2021-09-19 21:23:00 字數 1801 閱讀 9802

桶排序是將待排序集合中處於同乙個值域的元素存入同乙個桶中,也就是根據元素值特性將集合拆分為多個區域,則拆分後形成的多個桶,從值域上看是處於有序狀態的。對每個桶中元素進行排序,則所有桶中元素構成的集合是已排序的。

快速排序是將集合拆分為兩個值域,這裡稱為兩個桶,再分別對兩個桶進行排序,最終完成排序。桶排序則是將集合拆分為多個桶,對每個桶進行排序,則完成排序過程。兩者不同之處在於,快排是在集合本身上進行排序,屬於原地排序方式,且對每個桶的排序方式也是快排。桶排序則是提供了額外的操作空間,在額外空間上對桶進行排序,避免了構成桶過程的元素比較和交換操作,同時可以自主選擇恰當的排序演算法對桶進行排序。

當然桶排序更是對計數排序的改進,計數排序申請的額外空間跨度從最小元素值到最大元素值,若待排序集合中元素不是依次遞增的,則必然有空間浪費情況。桶排序則是弱化了這種浪費情況,將最小值到最大值之間的每乙個位置申請空間,更新為最小值到最大值之間每乙個固定區域申請空間,儘量減少了元素值大小不連續情況下的空間浪費情況。

桶排序過程中存在兩個關鍵環節:根據待排序集合中最大元素和最小元素的差值範圍和對映規則,確定申請的桶個數;

遍歷待排序集合,將每乙個元素移動到對應的桶中;

對每乙個桶中元素進行排序,並移動到已排序集合中。

步驟 3 中提到的已排序集合,和步驟 1、2 中的待排序集合是同乙個集合。與計數排序不同,桶排序的步驟 2 完成之後,所有元素都處於桶中,並且對桶中元素排序後,移動元素過程中不再依賴原始集合,所以可以將桶中元素移動回原始集合即可。

待排序集合為:[-7, 51, 3, 121, -3, 32, 21, 43, 4, 25, 56, 77, 16, 22, 87, 56, -10, 68, 99, 70]

對映規則為:

排序演算法為:堆排序,根據堆排序特性可知,

step 1:遍歷集合可得,最大值為:

step 2:

遍歷待排序集合,依次新增各元素到對應的桶中。

桶下標桶中元素

0-7, -3, -10

13, 4216

321, 25, 22432

543651, 56, 56768

877, 70987

1099

1112

13121

step 3:

對每乙個桶中元素進行排序,並移動回原始集合中,即完成排序過程。

def bucketsort(arr):

maximum, minimum = max(arr), min(arr)

for i in arr: # map every element in array to the corresponding bucket

index = i // 10 - minimum // 10

arr.clear()

for i in bucketarr:

heapsort(i) # sort the elements in every bucket

arr.extend(i) # move the sorted elements in bucket to array

第乙個迴圈作用為將待排序集合中元素移動到對應的桶中,複雜度為由演算法過程可知,桶排序的時間複雜度為

九大排序演算法之桶排序

桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,是將乙個資料表分割成許多buckets,然後每個bucket各自排序,或用不同的排序演算法,或者遞迴的使用bucket sort演算法。也是典型的divide and conquer分而治之的策略。它是乙個分布式的排序,介於msd基數...

排序演算法 桶排序

桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序並不...

排序演算法 桶排序

2009 12 02 12 01 2817人閱讀 桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均...