C 演算法之桶排序 非比較排序之二

2021-10-08 23:16:27 字數 1406 閱讀 5215

劃重點:求最值,初新組,正反填充陣列得

桶排序是計數排序的公升級版。它利用了函式的對映關係,高效與否的關鍵就在於這個對映函式的確定。

其過程與計數排序一致,也是進行「求最值,初新組,正填充,反填充 」的操作。不一樣的在於,桶排序需要遞迴呼叫來對桶內的陣列進行排序。

步驟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 這裡我們用到的唯一資料結構就是陣列,當然我們也可以利用鍊錶來實現下...