資料結構與演算法 基數排序

2021-07-24 16:26:42 字數 1501 閱讀 8345

基數排序是一種多關鍵字排序。以撲克牌排序為例,每張撲克牌有兩個「關鍵碼」:花色和面值,花色的權重大於面值,如紅桃a小於黑桃2。

通常有最高位優先msd (most significant digit first)和最低位優先lsd (least significant digit first)兩種實現方式。

1、低位優先lsd

(1)最低位優先法首先依據最低位關鍵碼kd對所有物件進行一趟排序

(2)再依據次低位關鍵碼kd-1對上一趟排序的結果再排序

(3)依次重複,直到依據關鍵碼k1最後一趟排序完成,就可以得到乙個有序的序列。

使用這種排序方法對每乙個關鍵碼進行排序時,不需要再分組,而是整個物件組都參加排序。

可以看出在進行每次排序時,直接根據上一次排序結果的當前位數值規則進行排序,沒有其他限制條件。如第二次排序時,將根據其第二位數值順序進行排序就可以了。

2、高位優先msd

(1) 先根據最高位關鍵碼k1排序,有多少不同的k1碼就需要分成多少組。k1碼相同的元素被分在同乙個組,如果此組內有多個元素,則需要繼續排序確定大小關係。

(2) 分別對元素多於乙個的每個k1組根據關鍵碼k2進行排序,按k2值的不同,再分成若干個更小的k2子組,每個子組中的元素具有相同的k1和k2值。

(3) 依此重複,直到每個組都只有乙個元素或對關鍵碼kd完成排序為止。

(4) 最後,把所有子組中的元素依次連線起來,就得到乙個有序的元素序列。

可以看出,msd除了第一次排序時限制,之後的排序都不能只根據當前位的數值規則,還要根據上一次排序的結果中是否處於同一組。如第二次排序時,因第一次排序和是不同的組,故只能分別根據和進行第二次排序。如果完全根據第二位數值規則對第一次結果排序,則會得到錯誤的結果。

3、lsd和msd的區別

可以看出,lsd實現更簡單。原因:高位關鍵碼的權重大於低位關鍵碼,不論元素的低位如何排序,元素的高位有「一位否決權」,而元素的高位排序確定時,低位只能區域性調整。即lsd時,按照當前位的數值大小排序永遠是正確的。而msd時,當前位的數值大小有可能破壞高位的排序結果,因而只能微調(組內排序)。

每次排序採用計數排序,lsd的**如下:

public

static

void

radixsort_lsd(int nums,int

base, int maxbits)

for (int j = 1; j < base; j++)

for (int j = len - 1; j >= 0; j--)

divide = divide * base;}}

資料結構與演算法 基數排序

基數排序是一種非比較型整數排序演算法,其原理是將資料按位數切割成不同的數字,然後按每個位數分別比較。假設說,我們要對 100 萬個手機號碼進行排序,應該選擇什麼排序演算法呢?排的快的有歸併 快排時間複雜度是 o n log n 計數排序和桶排序雖然更快一些,但是手機號碼位數是11位,那得需要多少桶?...

資料結構與演算法系列 基數排序

基數排序與其他的排序方法 都不同,它不需要比較關鍵字的大小。演算法的時間複雜度是o n 相比於快速排序的o nlgn 從表面上看具有不小的優勢.但事實上可能有些出入,因為基數排序的n可能具有比較大的係數k.因此在具體的應用中,應首先對這個排序函式的效率進行評估.它是根據關鍵字中各位的值,通過對排序的...

資料結構 排序演算法之計數排序與基數排序

一 計數排序 很好理解,就是對應每個數我們統計每個數字出現的次數,然後用乙個直接定址的雜湊表來存放資料,在通過遍歷這個雜湊表,進而就可以排好序了 如下所示 實現如下所示 void countsort int array,int size 開闢輔助空間 int range maxdata mindat...