桶排序 (bucket sort)或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)。
根據最大值最小值建立多個桶,確定各個桶之間的跨度,然後遍歷原始數列,把各元素放到對應的桶中,先是每個桶內的元素各自排序,然後遍歷輸出所有的桶內的所有元素,輸出結果即是排序好的陣列。
桶排序有點像分治法,把一大堆資料分成若干個桶,每個桶內各自排序,最後再合併。
桶排序的乙個要點就是如何確定桶的數量和桶與桶之間的跨度,在上面我看的程式設計師小灰的文章中他是建立與原始陣列長度數量相等的桶,除了最後乙個桶只包含乙個最大值之外,其餘各桶之間的區間跨度=(最大值-最小值)/(桶數量-1)。
假如有乙個這樣的陣列:
[3.31, 2.26, 3.94, 3.67, 4.96, 2.12, 3.91, 3.72, 0.12, 3.2, 0.01, 3.5, 2.78, 1.21, 2.97, 2.64]
一共有 16 個元素,所以我們建立 16 個桶。最大值為 4.96,最小值為 0.01,所以每個桶之間的跨度為 (4.96-0.01)/(16-1)=0.33。
然後遍歷原始陣列,將各元素放到對應的桶中:
然後各個桶內各自排序:
最後遍歷輸出桶內元素即可。
@test
public void testbucketsort()
doublearray[i] = random * 10;
doublearray[i] = double.valueof(string.format("%.2f", doublearray[i]));
}bucketsort(doublearray);
}public static double bucketsort(double origin) ;
}system.out.println("origin--->" + arrays.tostring(origin));
// 獲取陣列中最大值、最小值
double max = origin[0];
double min = origin[0];
for (int i = 0; i < origin.length; i++)
if (origin[i] < min)
}system.out.println("max--->" + max);
system.out.println("min--->" + min);
system.out.println("origin.length--->" + origin.length);
// 建立桶,數量與原始陣列的長度相同
arraylist> bucketlist = new arraylist<>();
for (int i = 0; i < origin.length; i++)
// 每個桶的區間跨度
double span = (max - min) / (origin.length - 1);
system.out.println("span--->" + span);
// 將資料放到對應桶,最後乙個桶永遠只會存在乙個元素,就是最大值
for (int i = 0; i < origin.length; i++)
system.out.println("bucketlist--->" + bucketlist);
// 將每個桶內部排序,collections.sort() 底層使用的是歸併排序
for (int i = 0; i < bucketlist.size(); i++)
system.out.println("bucketlist--->" + bucketlist);
// 遍歷桶,所有元素已經從小到大排序號,輸出所有元素即可
double sortedarray = new double[origin.length];
int index = 0;
for (listbucket : bucketlist)
}system.out.println("sortedarray--->" + arrays.tostring(sortedarray));
return origin;
}
結果如下:
假設原始數列有 n 個元素,分成 m 個桶,第一步求最大最小值時間複雜度為 o(n);第二步建立空桶時間複雜度為 o(m);第三步遍歷原始陣列時間複雜度為 o(n);第四步桶內各元素排序,歸併排序時間複雜度為 o(nlogn),所以時間複雜度為 o(n/m*log(n/m)*m);第五步輸出結果時間複雜度為 o(n),總的時間複雜度為 o(3n+m+n/m*log(n/m)*m)。去掉係數的話時間複雜度為 o(n+m+n(logn-logm))。
假設原始數列有 n 個元素,分成 m 個桶,空間複雜度為 o(m+n)。
1.當桶內元素分布均勻時,即 n=m 時,時間複雜度為 o(n)。
2.可以對小數進行排序。
1.當桶內元素分布極不均勻時時間複雜度為 o(nlogn),還會建立許多空桶,造成空間浪費。
排序演算法之桶排序
1 設定乙個定量的陣列當作空桶子 2 尋訪序列,並且按照要求把記錄乙個乙個放到對應的桶子去 3 對每個不是空的桶子進行排序。4 從不是空的桶子裡把專案再放回原來的序列中。include include include include typedef struct node node,list voi...
排序演算法之桶排序
桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序並不...
排序演算法之桶排序
桶排序的基本思想就是待排序的資料分別放入不同的桶中,這些桶之間其實是有序的。然後在這些桶中將分在裡面的資料進行排序。最終就完成了整個序列的排序。假設將乙個均勻分布在區間 0,200 的一些待排序的序列,分成20個桶中。每個桶的大小都是10。分別存資料 0,9 10,19 20,29 190,199 ...