c語言排序之桶排序

2021-08-14 18:42:32 字數 1390 閱讀 7929

桶排序 (bucket sort)

或所謂的

箱排序,是乙個

排序演算法

,工作的原理是將陣列分到有限數量的桶子裡。每個桶子再個別排序(有可能再使用別的

排序演算法

或是以遞迴方式繼續使用桶排序進行排序)。桶排序是

鴿巢排序

的一種歸納

結果。當要被排序的陣列內的數值是均勻分配的時候,桶排序使用線性時間(θ(

n))。但桶排序並不是 比較排序,他不受到 o(n log n) 

下限的影響。

假定:輸入是由乙個隨機過程產生的[0, 1)區間上均勻分布的實數。將區間[0, 1)劃分為n個大小相等的子區間(桶),每桶大小1/n:[0, 1/n), [1/n, 2/n), [2/n, 3/n),…,[k/n, (k+1)/n ),…將n個輸入

元素分配

到這些桶中,對桶中元素進行排序,然後依次連線桶輸入0 ≤a[1..n] <1輔助

陣列b[0..n-1]是一

指標陣列

,指向桶(鍊錶)

桶排序演算法要求,資料的長度必須完全一樣,程式過程要產生長度相同的資料,使用下面的方法:data=rand()/10000+10000上面提到的,每次下一次的掃瞄順序是按照上次掃瞄的結果來的,所以設計上提供相同的兩個桶資料結構。前乙個儲存每一次掃瞄的結果供下次呼叫,另外乙個臨時拷貝前一次掃瞄的結果提供給前乙個呼叫。

資料結構設計:鍊錶可以採用很多種方式實現,通常的方法是動態申請記憶體建立結點,但是針對這個演算法,桶裡面的鍊錶結果每次掃瞄後都不同,就有很多鍊錶的分離和重建。如果使用動態分配記憶體,則由於指標的使用,安全性低。所以,筆者設計時使用了陣列來模擬鍊錶(當然犧牲了部分的空間,但是操作卻是簡單了很多,穩定性也大大提高了)。共十個桶,所以建立乙個二維陣列,行向量的下標0—9代表了10個桶,每個行形成的一維陣列則是桶的空間。

平均情況下桶排序以線性時間執行。像基數排序一樣,桶排序也對輸入作了某種假設, 因而執行得很快。具 體來說,基數排序假設輸入是由乙個小範圍內的整數構成,而桶排序則 假設輸入由乙個隨機過程產生,該過程將元素一致地分布在區間[0,1)上。 桶排序的思想就是把區間[0,1)劃分成n個相同大小的子區間,或稱桶,然後將n個輸入數分布到各個桶中去。因為輸入數均勻分布在[0,1)上,所以一般不會有很多數落在乙個桶中的情況。為得到結果,先對各個桶中的數進行排序,然後按次序把各桶中的元素列出來即可。

**:

#include#include#include#include#include#define max(a,b)a>b?a:b

#define min(a,b)a>b?b:a

using namespace std;

int main()

for(i=0; i<10001; i++)//從b[0]開始輸出

}return 0;

}

C語言 桶排序

c語言 桶排序 比如十分制的成績排名 首先需要對陣列進行初始化,全部賦為0 表示0到10分值暫時沒有出現過 然後用for迴圈來輸入值 分數 將輸入的分數的賦給陣列下標 那麼所對應的值加一 表示該分數出現一次 以五個數舉例 如3,5,5,8,2 輸入後 輸出 通過兩層迴圈輸出 第一層迴圈控制下標,第二...

排序之桶排序

本文以 啊哈!演算法 為教材,個人理解整理。例 老師要給5個小朋友進行打分,滿分為10分,要求將最終的分數從高到低排序後顯示出來。輸入 5 3 5 2 8 輸出 8 5 5 3 2 桶排序就像它的名字一樣和桶很相似,如分數的範圍為0 10,那就可以分為11個 桶 分別為 桶0,桶1,桶2,桶3,桶4...

排序之桶排序

author mr.du date 2019 02 27 桶排序 桶排序中的桶是什麼概念呢?每乙個桶代表乙個區間範圍,裡面可以承載乙個或多個元素。第一步就是建立這些桶,確定每乙個桶的區間範圍,具體建立多少個桶如何確定它的區間範圍,有很多方法 我們這裡建立的桶數量等於原始數列的元素數量,除了最後乙個桶...