資料結構 基數排序學習筆記

2021-10-09 22:05:00 字數 1497 閱讀 3274

針對資料範圍過大(對手機號進行排序),資料不是整型(比如是字串)的這些特點,計數排序難以進行簡單的處理,但可以通過基數排序解決。

這裡我們舉出身高的例子(手機號的例子實在太長了):

請為一組身高進行排序:

192 168 131 147 145 189 177 142 172 203

首先我們觀察到,對於待排序的資料,其在不同位上數字的權重是不一樣的(百位》十位》個位),百位上大的數值一定比十位上大的數值來得大。

2?? > 1??  √          

?2? > ?1? ×

因此我們對最長為 k 的資料進行排序時,可以分成 k 步,每一次只比較每個資料的同一位上的數字,並對其排序。當然每一次的排序過程都要保證是穩定的,否則可能會丟失之前的排序順序導致出錯。

推薦從低位到高位的順序進行排序,此時只需要保證每輪排序的穩定即可有序;

如果使用從高位到低位的順序進行排序,高位大而低位小的時候會需要額外的判斷條件,不利於程式編寫。

比如身高例子中如果使用高位到低位的順序進行排序,

那麼第一輪迴圈時, 203 的百位是最大的 2 ,它會放在數列的最後乙個位置。

但第二輪迴圈時,203 的十位數為 0 ,它是否前移還需要判斷百位的相對大小,所以會造成重複判斷,

因此都推薦從低位到高位的順序進行排序。

對數字排序時,由於可能出現數字長度不一致的情況,那麼這個時候需要對高位補零;

對字串排序時,則可以對低位補零,並設定零是最小的字元,這不改變字串的大小。

原序列    192,168,131,147,145,189,177,142,172,203

第一輪 131,192,142,172,203,145,147,177,168,189

第二輪 203,131,142,145,147,168,172,177,189,192

第三輪 131,142,145,147,168,172,177,189,192,203

public

void

redixsort

(int

nums,

int maxlength)

//維護排名陣列

for(

int i=

1;i)//從後往前遍歷,更新原陣列

for(

int i=clonearray.length-

1;i>=

0;i--

)//複製一遍陣列,儲存本次迴圈的順序,供下次迴圈使用

clonearray = nums.

clone()

;}}//應該尋找一種o(1)複雜度的取模表示式

private

intgetmod

(int num,

int index)

資料結構 基數排序原理

先看兩個例子 例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,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作...

資料結構基礎 15 基數排序

基數排序是一種借助 多關鍵字排序 的思想來實現 單關鍵字排序 的內部排序演算法。實現多關鍵字排序通常有兩種作法 最低位優先法 lsd 先對k 0 進行排序,並按 k 0 的不同值將記錄序列分成若干子串行之後,分別對 k 1 進行排序,k d 1 依次類推,直至最後對最次位關鍵字排序完成為止。最高位優...