基数排序

  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4. #define MAXE 20 /*线性表中最多元素个数*/
  5. #define MAXR 10 /*基数的最大取值*/
  6. #define MAXD 8 /*关键字位数的最大取值*/
  7. typedef struct node
  8. {
  9. char data[MAXD]; /*记录的关键字定义的字符串*/
  10. struct node *next;
  11. } RecType;
  12. void RadixSort(RecType *&p,int r,int d)
  13. /*p为待排序序列链表指针,r为基数,d为关键字位数*/
  14. {
  15. RecType *head[MAXR],*tail[MAXR],*t;/*定义各链队的首尾指针*/
  16. int i,j,k;
  17. for (i=d-1;i>=0;i--) /*从低位到高位做d趟排序*/
  18. { for (j=0;j<r;j++) /*初始化各链队首、尾指针*/
  19. head[j]=tail[j]=NULL;
  20. while (p!=NULL) /*对于原链表中每个结点循环*/
  21. { k=p->data[i]-'0'; /*找第k个链队*/
  22. if (head[k]==NULL) /*进行分配,即采用尾插法建立单链表*/
  23. {
  24. head[k]=p;
  25. tail[k]=p;
  26. }
  27. else
  28. {
  29. tail[k]->next=p;
  30. tail[k]=p;
  31. }
  32. p=p->next; /*取下一个待排序的元素*/
  33. }
  34. p=NULL;
  35. for (j=0;j<r;j++) /*对于每一个链队循环*/
  36. if (head[j]!=NULL) /*进行收集*/
  37. { if (p==NULL)
  38. { p=head[j];
  39. t=tail[j];
  40. }
  41. else
  42. { t->next=head[j];
  43. t=tail[j];
  44. }
  45. }
  46. t->next=NULL; /*最后一个结点的next域置NULL*/
  47. }
  48. }
  49. void main()
  50. {
  51. RecType *h=NULL,*p,*t;
  52. char *A[]={"75","87","68","92","88","61","77","96","80","72"};
  53. int i,n=10;
  54. for (i=0;i<n;i++) /*构造不带头结点的单链表h*/
  55. {
  56. p=(RecType *)malloc(sizeof(RecType));
  57. strcpy(p->data,A[i]);
  58. if (h==NULL)
  59. {
  60. h=p;
  61. t=h;
  62. }
  63. else
  64. {
  65. t->next=p;
  66. t=p;
  67. }
  68. }
  69. t->next=NULL;
  70. printf("排序前:");
  71. for (i=0;i<n;i++)
  72. printf("%3s",A[i]);
  73. printf("\n");
  74. RadixSort(h,10,2);
  75. printf("排序后:");
  76. p=h;
  77. while (p!=NULL)
  78. {
  79. printf("%3s",p->data);
  80. p=p->next;
  81. }
  82. printf("\n");
  83. }