概念
桶排序 (bucket sort)或所謂的箱排序,桶排序是鴿巢排序的一種歸納結果。但桶排序並不是 比較排序,它不受到 o(n log n) 下限的影響。
桶排序是計數排序的公升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。為了使桶排序更加高效,我們需要做到這兩點:
在額外空間充足的情況下,盡量增大桶的數量
使用的對映函式能夠將輸入的 n 個資料均勻的分配到 k 個桶中
同時,對於桶中元素的排序,選擇何種比較排序演算法對於效能的影響至關重要。
實現原理
工作的原理是將陣列分到有限數量的桶子裡。每個桶子再分別排序(有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序)。
排序演示
元素分布在桶中:
然後,元素在每個桶中排序:
**實現
public static double bucketsort(double array)
if(i> bucketlist=new arraylist>();
for(int i=0;i());
} //第三步:遍歷原始陣列,將每個元素放入桶中
for(int i=0;ilist:bucketlist)
} return sortarray;
}
**中,所有的桶儲存在arraylist集合當中,每乙個桶被定義成乙個鍊錶(linkedlist),這樣便於在尾部插入元素。
定位元素屬於第幾個桶,是按照比例來定位:
(array[i] - min) * (bucketnum-1) / d
同時,**使用了jdk的集合工具類collections.sort來為桶內部的元素進行排序。collections.sort底層採用的是歸併排序或timsort,小夥伴們可以簡單地把它們當做是一種時間複雜度 o(nlogn)的排序。
演算法分析
空間複雜度
空桶占用的空間 + 數列在桶中占用的空間 =o(m+n)。
演算法穩定性
桶排序是穩定的
使用場景
當輸入的資料可以均勻的分配到每乙個桶中的時候,適合桶排序,同時也最快。
當輸入的資料被分配到了同乙個桶中的時候,不適合桶排序,同時也最慢。
桶排序非常快,但是同時也非常耗空間,基本上是最耗空間的一種排序演算法
排序 桶排序
首先,桶排序是一種簡單並且執行快的一種排序。第一步,對五個數進行排序。程式如下 include using namespace std int main 首先對陣列進行歸零 for int j 1 j 5 j 將輸入的數的個數存入陣列中。for int k 1 k 10 k 執行原理 桶排序,就是先...
排序演算法 桶排序
桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間 n 但桶排序並不...
排序演算法 桶排序
2009 12 02 12 01 2817人閱讀 桶排序 bucket sort 或所謂的箱排序,是乙個排序演算法,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序 有可能再使用別的排序演算法或是以遞迴方式繼續使用桶排序進行排序 桶排序是鴿巢排序的一種歸納結果。當要被排序的陣列內的數值是均...