內部排序(五)基數排序

2021-07-03 09:44:51 字數 2683 閱讀 6153

基數排序是一種借助多關鍵字排序的思想對單邏輯關鍵字進行排序的方法。實現的過程不需要之前的所有排序所需要的記錄關鍵字比較,移動等操作。

多關鍵字排序

多關鍵字排序通常有兩種方法:

1、msd(most significant digit)法,最高為優先法

2、lsd(least significant digit)法,最低位優先法

過程借助分配收集兩種操作。

過程演示

以lsd為例,假設原來有一串數值如下所示:

73, 22, 93, 43, 55, 14, 28, 65, 39, 81

首先根據個位數的數值,在走訪數值時將它們分配至編號0到9的桶子中:

0: 1: 81

2 :22

3 :73 93 43

4 :14

5 :55 65

6: 7:

8 :28

9 :39

第二步

接下來將這些桶子中的數值重新串接起來,成為以下的數列:

81, 22, 73, 93, 43, 14, 55, 65, 28, 39

接著再進行一次分配,這次是根據十位數來分配:

0: 1 :14

2 :22 28

3 :39

4 :43

5 :55

6 :65

7 :73

8 :81

9 :93

第三步

接下來將這些桶子中的數值重新串接起來,成為以下的數列:

14, 22, 28, 39, 43, 55, 65, 73, 81, 93

這時候整個數列已經排序完畢;如果排序的物件有三位數以上,則持續進行以上的動作直至最高位數為止。

lsd的基數排序適用於位數小的數列,如果位數多的話,使用msd的效率會比較好。msd的方式與lsd相反,是由高位數為基底開始進行分配,但在分配之後並不馬上合併回乙個陣列中,而是在每個「桶子」中建立「子桶」,將每個桶子中的數值按照下一數字的值分配到「子桶」中。在進行完最低位數的分配後再合併回單一的陣列中。

過程演示

演算法**

#include 

#include

#define max_num_of_key 8 //關鍵字項數的最大值

#define radix 10 //關鍵字基數,此時是十進位制整數的基數

#define max_space 10000

typedef

int keytype; //定義關鍵字型別為int

typedef

char infotype; //定義其他資訊型別為char

typedef

structslcell; //靜態鍊錶結點型別

typedef

structsllist; //靜態鍊錶型別

typedef

int arrtype[radix]; //指標陣列型別

//分配函式

//此函式按第i個關鍵字keys[i]建立radix個子表,使同一子表中記錄的keys[i]相同

//靜態鍊錶l的r域中記錄已按(keys[0],...,keys[i-1])有序

void distribute(slcell *r, int i, arrtype f,arrtype e)

for (p= r[0].next;p;p=r[p].next)else

e[j] = p;//更改子表表尾指標

}}//收集函式

//本函式按keys[i]自小到大地將f[0...radix-1]所指各子表依次鏈結成乙個鍊錶

//e[0...radix-1]為各子表的尾指標

void collect(slcell *r, int i, arrtype f, arrtype e)

}r[t].next = 0; //t指向最後乙個非空子表中的最後乙個結點

}//此函式對l作基數排序,使得l成為按關鍵字自小到大的有序靜態鍊錶,l.r[0]為頭結點

//l是採用靜態鍊錶表示的順序表

void radixsort(sllist *l)

l->r[l->recnum].next = 0;

//按lsd依次對個關鍵字進行分配和收集

for ( i = 0; i keynum; i++)

}

評價

基數排序法是屬於穩定性的排序,其時間複雜度為o (nlog(r)m),其中r為所採取的基數,而m為堆數,在某些時候,基數排序法的效率高於其它的穩定性排序法。

5 內部排序 基數排序

計數排序 前面所講的排序都 是基於比較的排序,都可稱為 比較排序 其下界為o nlogn 那麼有沒有時間複雜度為o n 的線性時間排序演算法呢?計數排序便是很基礎的一種線性時間排序,它 是基數排序的基礎 基本思想是 對每乙個元素x,確定小於x的元素個數,就可以把x直接放到它在有序序列中的位置上。具體...

排序演算法 五 基數排序

概念 時間複雜度最好 o n k k表示最大值的位數。最壞 o n k 平均 o n k 演示 399 298,98,1 的排序過程 1.先把資料變成相同位數的值 399298 098001 2.從個位數開始遍歷 001298 098399 3 十位數遍歷 001298 098399 4.百位數遍歷...

排序 基數排序

基數排序 radix sort 是屬於 分配式排序 distribution sort 基數排序法又稱 桶子法 bucket sort 或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些 桶 中,藉以達到排序的作用。排序思想 首先按照資料的最低位 個位 將資料分配到0 9...