資料結構學習記錄29 基數排序

2021-10-12 16:25:09 字數 1841 閱讀 4368

所謂的基數排序的基數,就是我們講進製時候的那個基數。比如十進位制的基數就是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,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作...