數列取值範圍過大,或者不為整數時,不再適用計數排序,公升級為桶排序來進行排序。
類別於計數排序中計數陣列的某乙個元素,桶排序中的每乙個桶代表了乙個區間範圍,裡面可以承載乙個或多個元素。桶排序的第一步就是建立這些桶,並確定每乙個桶的區間範圍。
舉例:2.2,0.5,5.5,4.24,0.54,3.36
具體建立多少個桶,如何確定桶的區間範圍,有很多不同的方式。面對少量資料,可以建立和原始資料量相同的桶數量,除了最後乙個桶只包含數列的最大值,其餘的每個桶的區間按比例分配。
區間跨度 = ( 最大值 - 最小值 ) / ( 桶的數量 - 1 )
桶數:6
區間跨度 = ( 5.5 - 0.5 ) / ( 6 - 1) = 1
桶區間:[0.5,1.5),[1.5,2.5),[2.5,3.5),[3.5,4.5),[4.5,5.5),[5.5,5.5]
桶排序的第二步就是遍歷原始數列,然後把元素對號入座放入各個桶中。
比如 0.5 放入第乙個桶,2.2 放入第二個桶,5.5 放入最後乙個桶,依次類推,注意區間開閉
桶一:0.5,0.54 桶二:2.2
桶三:3.36 桶四:4.24
桶五:無 桶六:5.5
桶排序的第三步就是對桶內元素分別排序即可。桶內排序在資料量較小時可以使用直接插入排序,資料量較大時使用快速排序。
比如這裡只需要對第乙個桶進行排序,得到第乙個桶裡順序為 0.5,0.54
桶排序的第四步就是按順序遍歷所有桶,輸出其中的所有元素。
最後的順序為0.5,0.54,2.2,3.36,4.24,5.5
對於 n 個資料,我們建立 m 個桶進行排序,則它的:
public
void
bucketsort
(double
nums)
//獲取跨度值
double d = max - min;
//建立桶
int bucketnum = nums.length;
arraylist
> bucketlist =
newarraylist
<
>()
;for
(int i=
0;i)//將數字放入對應桶中
for(
double num:nums)
//對每個桶內元素進行排序
for(linkedlist
list : bucketlist)
//將原陣列進行排序輸出
int index =0;
for(linkedlist
list : bucketlist)
}}
這裡判斷數字位於哪個桶中的方法,複雜度是o(1),需要記住這個方法。 資料結構 基數排序(桶排序)
基數排序和計數排序都屬於 非比較排序 有關計數排序可檢視 基數排序介紹 基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作...
資料結構與演算法 桶排序
與基數排序法一樣,桶排序也是一種排序的思想。待排資料的值必須在乙個範圍內,然後把這個值域空間劃分為若干區塊,每乙個對應乙個桶,把待排陣列放入到合適的桶中,再對桶內的資料採用任意一種方式排序。整個時間複雜度分為兩部分,第一部分是入桶,為on,第二部分則是所有桶內排序的時間。演算法導論 中證明了這個整體...
資料結構與演算法 桶排序
桶排序可以看成是計數排序的公升級版,它將要排的資料分到多個有序的桶裡,每個桶裡的資料再單獨排序,再把每個桶的資料依次取出,即可完成排序。我們拿一組計數排序啃不掉的資料 500,6123,1700,10,9999 來舉例。第一步,我們建立 10 個桶,分別來裝 0 1000 1000 2000 200...