(箱子)桶排序及基數排序

2021-10-21 23:58:18 字數 2036 閱讀 9936

桶排序是基於鍊錶的,相鄰的桶之間和桶中相鄰的元素之間皆用鍊錶相連線,可以把它想象成乙個矩陣。

用乙個例子來說明桶排序。

假設有乙個鍊錶,其中的元素需要進行排序,元素為abcdefghij,其值依次為2454304344,如a2->b4->c5->d4->e3->f0->g4->h3->i4->j4。若根據值進行排序。首先我們定義5個桶bin[5]用來裝這10個元素,然後依次遍歷每個元素,根據其值將其放入對應的桶中,及bin[0]=f,bin[1]=null,bin[2]=a,bin[3]=,bin[4]=,bin[5]=c。最後我們根據bin[0]~bin[5]桶的順序重新排列元素,及faehjbdgic。至此桶排序完成。

桶排序時需要先刪除原先各個節點的後驅結點指標,然後再將各個節點分配至各個桶中,把每乙個箱子中節點在用鍊錶串聯起來,再根據桶的順序重新排列節點。

接下來是**

void

binsort

(linklist

&chain,

int range)

for(

int i=range,i>=

0;i++

)while

(!bin[i]

.empty()

)delete

bin;

}

**思路:bin陣列下標為0~range,所以大小為range+1。第乙個for迴圈遍歷原煉表中每個元素並分配至相應的桶中,利用get函式得到陣列第乙個元素並儲存到node節點中,erase函式對原鍊錶元素進行刪除,再利用insert函式將get到的元素插入到各個桶中。至此,元素在桶中與桶之間有序。第二個for迴圈遍歷桶及桶中元素,再次利用get、earse和insert函式依次將排序後的元素重返至原煉表中。

在資料結構黑皮書中還給出了桶排序作為鍊錶chain成員函式的具體實現,**也很有意思,可以借鑑。

template

<

class

t>

void chain

::binsort

(int range)

//將原鍊錶節點分配到箱中

for(

; firstnode !=

null

; firstnode = firstnode-

>next)

}//把箱子中的節點收集到有序鍊錶

chainnode

*y =

null

;for

(int i =

0; i <= range; i++)}

}

桶排序時間複雜度為o(n+range),觀察**可發現桶排序不會改變值相同的節點的相對次序,所以是一種穩定排序。

基數排序是桶排序的擴充套件,與桶排序不同,基數排序並不對數進行直接排序,而是把數按照某種基數radix分解為數字,然後對數字進行排序。如基數10可以把十進位制數928分解為9、2、8,基數60可以把十進位制數3725分解為1、2、5。這就是基數排序。

用乙個例題來具體說明。假設對0~999的10個整數進行排序,若使用桶排序,則range=1000,這時候需要初始化1000個步驟,節點分配需要10個步驟,析構又需要1000個步驟,總共2010個步驟。

而採用基數排序,將基數r=10。

假設10個數字分別為:216->521->425->116->91->515->124->34->96->24

首先按照最低位(個位)對鍊錶進行排序,結果為:521->91->124->34->24->425->515->216->116->96

接著按照第二位(十位)對鍊錶進行排序,結果為:515->216->116->521->124->24->425->34->91->96

最後按照第三位(百位)對鍊錶進行排序,結果為:24->34->91->96->116->124->216->425->515->521

至此,基數排序完成。

基數排序是在桶排序的基礎上發展而來,是一種穩定的排序,時間複雜度為o(cn)=o(n),c為常量。

箱子排序(桶排序),基數排序

include include include include circularlistwithheader.h include extendedchain.h include 本演算法為箱子排序的演算法 author zailushang data 2020 06 27 目的為了熟悉c 的雙向鍊錶...

基數排序(桶排序)

1。什麼是基數排序 radix sort 基數排序 屬於分配式排序 distribution sort 又稱 桶排序 bucket sort 它是通過鍵值的各個位的值,將要排序的元素分配至某些 桶 中,達到排序的作用。2.它和歸併一樣,屬於穩定型演算法。public void radixsort i...

基數排序(桶排序)

思想 先把這組資料的個位排有序,再把十位排有序,再排百位 千位 include include include include void showarr int arr,int len printf n int getmaxnumfin int arr,int len 找陣列中最大數,並求出最大數的...