• 基数排序

    基数排序

    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. }