【基數排序】
基數排序的演算法思想:基數排序不同於前面的各種排序演算法,前面的排序演算法都是基於元素之間的比較好實現的,而基數排序則是利用分類進行排序的方法。
【演算法思想】
基數排序是一種多關鍵字排序演算法。基數排序通過對所有元素根據關鍵字進行分類,然後按照關鍵字的順序將這些元素收集起來,通過這樣的方法完成對元素序列的排序。因此基數排序演算法分成兩個分部:分配和收集。
具體演算法描述:假設第i個元素a_i的關鍵字為key_i,key_i是由d位個十進位制組成,即key_i=ki^d ki^d-1 ... ki^1,其中ki^1為最低位,ki^d為最高位。關鍵字的每一位數字都可以作為乙個子關鍵字。首先將每乙個元素依次按照每個關鍵字進行排序並收集,直到按照所有的關鍵字都排序、收集完畢,這樣就完成了排序過程。
【示例】
例如,一組元素序列為325,138,29,214,927,631,732,205。這組元素的位數最多是3,在排序之前首先將所有元素都轉換為3位數字組成的數,不夠3位的在前面新增0,即325,138,029,214,927,631,732,205。對這組元素進行基數排序需要進行3趟分配和收集。其次需要對該元素序列的關鍵字的最低位即個位上的數字進行分配和收集,再對十位數字進行分配和收集,最後是對最高位的數字進行分配和收集。一般情況下,採用鍊錶實現基數排序。
對最低位進行分配和收集的過程如下圖所示。
其中,陣列f[i]儲存第i個鍊錶的頭指標,陣列r[i]儲存第i個鍊錶的尾指標。
對十位數字的分配和收集的過程如下圖所示。
對百位數字的分配和收集的過程如下圖所示。
由上很容易看出,經過第1趟排序即對個位數字作為關鍵字進行分配後,關鍵字被分為10類,個位數組相同的數字被劃分為一類,然後對分配後的元素進行收集之後,得到以個位數字非遞減排列的元素。同理,經過第2趟分配和收集後,得到以十位數字非遞減排列的元素序列。經過第3趟分配和收集後,得到最終排序結果。
code:
#include#include#include#include#include#define maxsize 200 /*待排序元素的最大個數*/
#define n 8 /*待排序元素的實際個數*/
#define maxnumkey 6 /*關鍵字項數的最大值*/
#define radix 10 /*關鍵字基數,10表示十進位制數字可以分為十組*/
/*靜態鍊錶的結點,存放待排序元素*/
typedef struct
slistcell;
/*靜態鍊錶,存放元素序列*/
typedef struct
slist;
typedef int addr[radix]; /*指標陣列型別,用來指向每個鍊錶的第1個結點和最後乙個結點*/
void displist(slist l); /*輸出鍊錶中的元素*/
void dispstaticlist(slist l); /*以靜態鍊錶的形式輸出元素*/
void initlist(slist *l, int d, int n);
int trans(char c); /*將字元轉換為數字*/
void distribute(slistcell data, int i, addr f, addr r); /*分配*/
void collect(slistcell data, addr f, addr r); /*收集*/
void radixsort(slist *l); /*基數排序*/
void distribute(slistcell data, int i, addr f, addr r)
/*為data陣列中的第i個關鍵字key[i]建立radix個子表,使同一子表中元素的key[i]相同*/
/*f[0..radix-1]和r[0..radix-1]分別指向各個子表中第乙個和最後乙個元素*/
}void dispstaticlist(slist l)
/*按鍊錶形式輸出靜態鍊錶*/
printf("\n");
}int trans(char c)
/*將字元c轉化為對應的整數*/
結果:
【主要用途】
基數排序演算法實現複雜,它是一種多關鍵字排序演算法,屬於分類排序。因為基數排序演算法不需要過多比較,所以在資料較多的情況下,採用基數排序演算法的效率要優於前面談到的排序演算法。
【穩定性與複雜度】
基數排序是一種穩定的排序演算法。
基數排序演算法的時間複雜度為o(d(n+r)),其中,n表示待排序的元素個數,d表示關鍵字個數,r表示基數。其中一趟分配時間複雜度為o(n),一趟收集時間複雜度為o(r)。
基數排序需要2*r個指向鏈式佇列的輔助空間。
演算法 8 基數排序
1.基數排序 1.2 include include define dbmsg fmt,args printf s s d fmt n file function line args intdump array int arr int len printf n return 0 int get po...
驗證演算法(8)基數排序
include include include define maxe 20 線性表中最多元素個數 define maxr 10 基數的最大取值 define maxd 8 關鍵字位數的最大取值 typedef struct node rectype void crealink rectype p,...
基礎演算法 8 基數排序
基數排序 假設 如果要排序的專案是大範圍但小數字的整數,我們可以將計數排序 counting sort 思想與基數排序 radix sort 結合起來,以實現線性時間複雜度。在基數排序中,我們將每個專案排序為乙個 w 數字串 如果需要,我們填充小於w數字的前幾個零的整數 對於最低有效位 最右邊 到最...