一测摔、簡(jiǎn)介
基數(shù)排序是按照低位先排序,然后收集解恰;再按照高位排序避咆,然后再收集舟肉;依次類(lèi)推,直到最高位查库。有時(shí)候有些屬性是有優(yōu)先級(jí)順序的路媚,先按低優(yōu)先級(jí)排序,再按高優(yōu)先級(jí)排序樊销。最后的次序就是高優(yōu)先級(jí)高的在前整慎,高優(yōu)先級(jí)相同的低優(yōu)先級(jí)高的在前∥唬基數(shù)排序基于分別排序裤园,分別收集,所以是穩(wěn)定的剂府。
二拧揽、步驟
<1>.取得數(shù)組中的最大數(shù),并取得位數(shù)腺占; <2>.arr為原始數(shù)組淤袜,從最低位開(kāi)始取每個(gè)位組成radix數(shù)組; <3>.對(duì)radix進(jìn)行計(jì)數(shù)排序(利用計(jì)數(shù)排序適用于小范圍數(shù)的特點(diǎn))衰伯;
三铡羡、示例
四、代碼實(shí)現(xiàn)
#define D 3 /* D為排序碼的最大位數(shù) */
#define R 10 /* R為基數(shù) */
typedef int KeyType;
typedef int DataType;
struct Node; /* 單鏈表結(jié)點(diǎn)類(lèi)型 */
typedef struct Node RadixNode;
struct Node {
KeyType key[D];
/* DataType info;*/
RadixNode *next;
};
typedef RadixNode * RadixList;
typedef struct QueueNode {
RadixNode *f; /* 隊(duì)列的頭指針 */
RadixNode *e; /* 隊(duì)列的尾指針 */
} Queue;
Queue queue[R];
void radixSort(RadixList * plist, int d, int r) {
int i,j,k;
RadixNode *p, *head = (*plist)->next;
for(j = d-1; j >= 0; j--) { /* 進(jìn)行d次分配和收集*/
p = head;
for(i = 0; i < r; i++) {
queue[i].f = NULL; queue[i].e = NULL; /* 清隊(duì)列 */
}
while (p != NULL) {
k = p->key[j]; /* 按排序碼的第j個(gè)分量進(jìn)行分配*/
if (queue[k].f == NULL)
queue[k].f = p; /* 若第k個(gè)隊(duì)列為空意鲸,則當(dāng)前記錄為隊(duì)頭*/
else (queue[k].e)->next = p;/* 否則當(dāng)前記錄鏈接到第k隊(duì)的隊(duì)尾*/
queue[k].e = p;
p = p->next;
}
for(i = 0; queue[i].f == NULL; i++) /* 找出第一個(gè)非空隊(duì)列*/
;
p = queue[i].e; head = queue[i].f; /* head為收集鏈表的頭指針*/
for(i++; i < r; i++)
if(queue[i].f != NULL) { /* 收集非空隊(duì)列 */
p->next = queue[i].f;
p = queue[i].e;
}
p->next = NULL;
}
(*plist)->next = head;
}
struct Node element[11]={
0,0,0,NULL,/*表頭*/
0,3,6,NULL,/*36*/
0,0,5,NULL,/*5*/
0,1,6,NULL,/*16*/
0,9,8,NULL,/*98*/
0,9,5,NULL,/*95*/
0,4,7,NULL,/*47*/
0,3,2,NULL,/*32*/
0,3,6,NULL,/*36*/
0,4,8,NULL,/*48*/
0,1,0,NULL /*10*/
};
int main(){
int i;
RadixList p = element;
for (i = 0; i < 10; i++)
element[i].next = &element[i+1];
element[10].next = NULL;
radixSort(&p, 3, 10);
p = p->next;
while (p != NULL){
printf("%d ", p->key[1]*10+p->key[2]);
p = p->next;
}
getchar();
return 0;
}
五烦周、評(píng)價(jià)
基數(shù)排序是穩(wěn)定的。
六怎顾、參考資料
經(jīng)典排序算法系列9----分配排序(桶排序和基數(shù)排序)
計(jì)數(shù)排序读慎、基數(shù)排序和桶排序
十大經(jīng)典算法總結(jié)(Javascript描述)