八大排序之基數排序

2021-08-17 10:22:08 字數 1822 閱讀 5148

個人部落格: && 

建議先看排序綜述,傳送門:資料結構與演算法系列之一:八大排序綜述。

基數排序(英語:radix sort)是一種非比較型整數排序演算法,其原理是將整數按位數切割成不同的數字,然後按每個位數分別比較。由於整數也可以表達字串(比如名字或日期)和特定格式的浮點數,所以基數排序也不是只能使用於整數。基數排序的發明可以追溯到2023年赫爾曼·何樂禮在打孔卡片製表機(tabulation machine)上的貢獻。

基數排序法會使用到桶 (bucket),顧名思義,通過將要比較的位(個位、十位、百位…),將要排序的元素分配至 0~9 個桶中,藉以達到排序的作用,在某些時候,基數排序法的效率高於其它的比較性排序法。

它是這樣實現的:

基數排序的方式可以採用lsd(least significant digital)或msd(most significant digital),lsd的排序方式由鍵值的最右邊開始,而msd則相反,由鍵值的最左邊開始。

wordzzzz的小資料規模演示:

* 獲取陣列a中最大值

*/template

int get_max(t *array, const

int length)

/* * 對陣列按照"某個位數"進行排序(桶排序)

*/template

void count_sort(t *array, const

int length, int

exp)

int i, buckets[10] = ;

for (i = 0; i < length; i++) // 將資料出現的次數儲存在buckets中

buckets[(array[i] / exp) % 10]++;

for (i = 1; i < 10; i++) // 更改buckets[i]。目的是讓更改後的buckets[i]的值,是該資料在output中的位置。

buckets[i] += buckets[i - 1];

for (i = length - 1; i >= 0; i--) // 將資料儲存到臨時陣列output中,這裡的對應關係一定要捋清楚

output[--buckets[(array[i] / exp) % 10]] = array[i];

for (i = 0; i < length; i++) // 將排序好的資料賦值給array

array[i] = output[i];}/*

* 基數排序

*/template

void radixsort(t *array, const

int length)

其中,d 為位數,r 為基數,n 為原陣列個數。在基數排序中,因為沒有比較操作,所以在複雜上,最好的情況與最壞的情況在時間上是一致的,均為 o(d*(n + r))。

基數排序不改變相同元素之間的相對順序,因此它是穩定的排序演算法。

基數排序 vs 計數排序 vs 桶排序

這三種排序演算法都利用了桶的概念,但對桶的使用方法上有明顯差異:

完的汪(∪。∪)。。。zzz

八大排序之基數排序

開始研究基數排序,還以為很複雜呢,誰知道也挺簡單的,它是一種非比較的排序,首先找到最大的位數,也就是先確定裡面最大的數有幾位,依次對個位,十位,等進行排序,它的原理就是你在對個位的大小進行排序時,算了,還是放圖吧 個位排序 它已經出現了基本有序 相對於十位來說 如,142,157,142也就在157...

八大排序 基數排序

基數排序 將整形10進製按每位拆分,然後從低位到高位依次比較各個位。每次比較完進行排序,直到整個陣列有序 主要分為兩個過程 1 分配,先從個位開始,根據位值 0 9 分別放到0 9號桶中 比如53,個位為3,則放入3號桶中 2 收集,再將放置在0 9號桶中的資料按順序放到陣列中 重複 1 2 過程,...

八大排序之歸併 基數排序

歸併排序 將兩個或兩個以上的有序表組合乙個新的有序表稱為 歸併 先使每個子串行有序,再歸併使子串行段有序,最後得到完全有序的序列。演算法思想 我們通常用遞迴實現,先把待排序區間 startindex,endindex 以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸...