结构推理 试编写一个将一组英文单词按字典序排列的基数排序算法。设单词均由大写字母构成,最长的单词有d个字母。
【正确答案】(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)。
【答案解析】