劃重點:求最值,初新組,正反填充陣列得
桶排序是計數排序的公升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。
其過程與計數排序一致,也是進行「求最值,初新組,正填充,反填充 」的操作。不一樣的在於,桶排序需要遞迴呼叫來對桶內的陣列進行排序。
步驟0:人為設定乙個bucketsize【作為每個桶所能放置多少個不同數值(例如當bucketsize==5時,該桶可以存放{1,2,3,4,5}這幾種數字,但是容量不限,即可以存放100個3)】
步驟1:求最值,獲取陣列最大最小值;
步驟1:初新組(初始化桶),桶的大小根據bucketsize與陣列最大最小差值而定。桶內為則存放步驟0的乙個集合;
步驟2:正填充,遍歷輸入資料,並且把資料乙個乙個放到對應的桶裡去;
步驟3:桶內排序:對每個不是空的桶進行排序,可以使用其它排序方法,也可以遞迴使用桶排序;
步驟4:反填充,從不是空的桶裡把排好序的資料拼接起來。
注意,如果遞迴使用桶排序為各個桶排序,則當桶數量為1時要手動減小bucketsize增加下一迴圈桶的數量,否則會陷入死迴圈,導致記憶體溢位。
如下:
**如下
public listbucketsortrecursion2(listarray, int bucketsize)
//求最值
int max = array[0], min = array[0];
foreach (var item in array)
//初新組(桶)
//初始化桶數量
int bucketcount = (max - min) / bucketsize + 1;
var buckets = new list>(bucketcount);
for (int i = 0; i < bucketcount; i++)
//正填充
for (int i = 0; i < array.count; i++)
//反填充
listarrayresult = new list();
for (int i = 0; i < bucketcount; i++)
}else
//遞迴呼叫
listtemp = bucketsortrecursion2(buckets[i], bucketsize);
foreach (var item in temp)}}
return arrayresult;
}
圖源 非比較排序 桶排序
相對於計數排序,桶排序和計數排序的差別就在於處理相同資料的差別上。計數排序假設輸入資料都屬於乙個小區間內的整數,而桶排序則是假設輸入是由乙個隨時過程產生的,該過程將元素均勻分布在 0,1 區間上。在桶排序的過程中有乙個非常重要的地方就是,投射的位置 current data number array...
排序(二)非比較排序
七大排序那篇部落格講的排序都是比較排序,這篇部落格要寫的內容是不需要通過比較就可以排序。1.計數排序 解題思路 開闢一塊陣列,範圍為最大數減去最小數,用這個數減去最小值的差,對應的下標來統計,剛開始都初始化為0,如果有就把新開闢中的值 最後按順序遍歷新開闢的陣列,把值放到原陣列中,就可以打到排序的目...
排序演算法總結2一非比較排序
目錄 一.計數排序 countingsort 二.基數排序 radixsort 二.桶排序 bucketsort 這篇文章中我們來 一下常用的非比較排序演算法 計數排序,基數排序,桶排序。在一定條件下,它們的時間複雜度可以達到o n 這裡我們用到的唯一資料結構就是陣列,當然我們也可以利用鍊錶來實現下...