【正确答案】(1)数据结构
#define D常数1 /*D为排序码的最大位数*/
#define R 27 /*R为基数*/
typedef char KeyType;
struct Node; /*单链表结点类型*/
typedef struct Node RadixNode;
struct Node{
Keyrype key[D];
DataType info;
RadixNode*next;
};
typedef RadixNode*RadixList;
typedef struct QueueNode{
RadixNode*f; /*对列的头指针*/
RadixNode*e: /*对列的尾指针*/
}Queue;
(2)思路
所有长度不足d个字母的单词,都在尾部补足空格,排序时设置27个箱子,分别与空格,A,B,…,Z对应。
(3)算法
void radixSort(RadixList*plist,int d){
/*对链表按不减顺序进行基数排序,链表中第一个结点为表头结点*/
int i,j,k;
Queue queue[R];
RadixNode*p,*head;
head=(*plist)->next;
for(j=d-1;j>=0;j--){ /*进行d次分配和收集*/
p=head:
for(i=0;i<R;i++){
queue[i].f=NULL; /*清队列*/
queue[i].e=NULL;
}
while(p!=NULL){
if(p->key[j]=='')k=0;
else k=(p->key[j]-'A'+1)/%R;
/*按排序码的第j个分量进行分配*/
if(queue[k].f==NULL)
/*若第k个堆为空,则当前记录为队头*/
queue[k].f=p;
else(queue[k].e)->next=p;
/*否则当前记录链接到第k队的队尾*/
queue[k].e=p;
p=p->next;
}
i=0;
while(queue[i].f==NULL)i++;
/*从r个队列中找出第一个非空的队列*/
p=queue[i].e;
head=queue[i].f; /*head为收集链表的头指针*/
for(i++;i<R;i++)
if(queue[i].f!=NULL){
p->next=queue[i].f;
p=queue[i].e;
} /*收集非空队列*/
p->next=NULL;
}
(*plist)->next=head;
{
(4)代价分析
该算法的时间复杂度是T(n)=O(d(r+n))=O(d(27+n))=O(dn)。
【答案解析】