所謂的基數排序的基數
,就是我們講進製
時候的那個基數。比如十進位制的基數就是10,二進位制的基數就是2。其中,從右向左開始第n位,實際上表示的是基數的n次方倍。比如1012表示1⋅2
0+0⋅
21+1
⋅221\cdot2^0+0\cdot2^1+1\cdot2^2
1⋅20+0
⋅21+
1⋅22
那麼,我們可以通過先比較某一位,進行排序,然後再比較另一位進行排序,直到排完所有的位數。比如我們以lsd低位優先法
,從右往左一位一位的比較;或者msd高位優先法
,從左到右一位一位的比較,從左往右一位一位的比較。
過程:建立基數個佇列,下標從0開始。
取關鍵字某位的值,存入對應編號的佇列(有點像雜湊表)
從0或者從基數-1的佇列開始,遞增或遞減出隊,這樣出隊構成的順序表、鍊錶是某位有序的。
重複更改位數,並2、3,直到所有位都有序,最後出隊的佇列就有序。
一般我們用的都是10進製,所以採取基數為10更直觀。
假設我們對這些數以低位優先的方式排序:
對低位進行排序:
對次低位排序:
再次低位:
這樣就拍好了。
**很很很簡單,所以就不想寫了,抄個**,菜鳥教程 1.10 基數排序:
#include
#define max 20
//#define showpass
#define base 10
void
print
(int
*a,int n)
}void
radixsort
(int
*a,int n)
}while
(m / exp >0)
;for
(i =
0; i < n; i++
)for
(i =
1; i < base; i++
)for
(i = n -
1; i >=
0; i--
)for
(i =
0; i < n; i++
) exp *
= base;
#ifdef showpass
printf
("\npass : ");
print
(a, n)
;#endif
}}intmain()
printf
("\narray : ");
print
(&arr[0]
, n)
;radixsort
(&arr[0]
, n)
;printf
("\nsorted : ");
print
(&arr[0]
, n)
;printf
("\n");
return0;
}
資料結構 基數排序學習筆記
針對資料範圍過大 對手機號進行排序 資料不是整型 比如是字串 的這些特點,計數排序難以進行簡單的處理,但可以通過基數排序解決。這裡我們舉出身高的例子 手機號的例子實在太長了 請為一組身高進行排序 192 168 131 147 145 189 177 142 172 203首先我們觀察到,對於待排序...
資料結構 基數排序原理
先看兩個例子 例1 有一組數字包含20個整數,範圍1 20,數字亂序排列,如何恢復從小到大的排列順序?15,03,07,17,11,04,19,13,06,18,16,02,09,05,12,14,08,20,10,01 且看我的方法。先把以上數字按個位數的大小從小到大排,注意,只看個位 20,01...
資料結構 基數排序(桶排序)
基數排序和計數排序都屬於 非比較排序 有關計數排序可檢視 基數排序介紹 基數排序 radix sort 屬於 分配式排序 distribution sort 又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作...