個人部落格: &&
建議先看排序綜述,傳送門:資料結構與演算法系列之一:八大排序綜述。
基數排序(英語: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 以中點二分,接著把左邊子區間排序,再把右邊子區間排序,最後把左區間和右區間用一次歸...