1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<math.h>
  4. #include<string.h>
  5. #define MaxNumKey 6 /*keyword项数的最大值*/
  6. #define Radix 10 /*keyword基数,此时是十进制整数的基数*/
  7. #define MaxSize 1000
  8. #define N 6
  9. typedef int KeyType; /*定义keyword类型*/
  10. typedef struct
  11. {
  12. KeyType key[MaxNumKey]; /*keyword*/
  13. int next;
  14. }SListCell; /*静态链表的结点类型*/
  15.  
  16. typedef struct
  17. {
  18. SListCell data[MaxSize]; /*存储元素,data[0]为头结点*/
  19. int keynum; /*每一个元素的当前keyword个数*/
  20. int length; /*静态链表的当前长度*/
  21. }SList; /*静态链表类型*/
  22. typedef int addr[Radix]; /*指针数组类型*/
  23.  
  24. typedef struct
  25. {
  26. KeyType key; /* keyword项 */
  27. }DataType;
  28.  
  29. void PrintList(SList L);
  30. void PrintList2(SList L);
  31. void InitList(SList *L,DataType d[],int n);
  32. int trans(char c);
  33. void Distribute(SListCell data[],int i,addr f,addr r);
  34. void Collect(SListCell data[],addr f,addr r);
  35. void RadixSort(SList *L);
  36. void InitList(SList *L,DataType a[],int n)
  37. /* 初始化静态链表L(把数组D中的数据存于L中) */
  38. {
  39. char ch[MaxNumKey],ch2[MaxNumKey];
  40. int i,j,max=a[0].key;
  41. for(i=1;i<n;i++) /*将最大的keyword存入max*/
  42. if(max<a[i].key)
  43. max=a[i].key;
  44. (*L).keynum=(int)(log10((float)max))+1; /*求keyword的个数*/
  45. (*L).length=n; /*待排序个数*/
  46. for(i=1;i<=n;i++)
  47. {
  48. itoa(a[i-1].key,ch,10); /*将整型转化为字符,并存入ch*/
  49. for(j=strlen(ch);j<(*L).keynum;j++) /*假设ch的长度<max的位数,则在ch前补'0'*/
  50. {
  51. strcpy(ch2,"0");
  52. strcat(ch2,ch);
  53. strcpy(ch,ch2);
  54. }
  55. for(j=0;j<(*L).keynum;j++) /*将每一个keyword的各个位数存入key*/
  56. (*L).data[i].key[j]=ch[(*L).keynum-1-j];
  57. }
  58. for(i=0;i<(*L).length;++i) /*初始化静态链表*/
  59. (*L).data[i].next=i+1;
  60. (*L).data[(*L).length].next=0;
  61. }
  62.  
  63. int trans(char c)
  64. /*将字符c转化为相应的整数*/
  65. {
  66. return c-'0';
  67. }
  68. void Distribute(SListCell data[],int i,addr f,addr r)
  69. /*为data中的第i个keywordkey[i]建立Radix个子表,使同一子表中元素的key[i]同样*/
  70. /*f[0..Radix-1]和r[0..Radix-1]分别指向各个子表中第一个和最后一个元素*/
  71. {
  72. int j,p;
  73. for(j=0;j<Radix;j++) /*将各个子表初始化为空表*/
  74. f[j]=0;
  75. for(p=data[0].next;p;p=data[p].next)
  76. {
  77. j=trans(data[p].key[i]); /*将相应的keyword字符转化为整数类型*/
  78. if(!f[j]) /*f[j]是空表。则f[j]指示第一个元素*/
  79. f[j]=p;
  80. else
  81. data[r[j]].next=p;
  82. r[j]=p; /*将p所指的结点插入第j个子表中*/
  83. }
  84. }
  85.  
  86. void Collect(SListCell data[],addr f,addr r)
  87. /*按key[i]将f[0..Radix-1]所指各子表依次链接成一个静态链表*/
  88. {
  89. int j,t;
  90. for(j=0;!f[j];j++); /*找第一个非空子表。succ为求后继函数*/
  91. data[0].next=f[j];
  92. t=r[j]; /*r[0].next指向第一个非空子表中第一个结点*/
  93. while(j<Radix-1)
  94. {
  95. for(j=j+1;j<Radix-1&&!f[j];j++); /*找下一个非空子表*/
  96. if(f[j]) /*将非空链表连接在一起*/
  97. {
  98. data[t].next=f[j];
  99. t=r[j];
  100. }
  101. }
  102. data[t].next=0; /*t指向最后一个非空子表中的最后一个结点*/
  103. }
  104.  
  105. void RadixSort(SList *L)
  106. /*对L进行基数排序,使得L成为按keyword非递减的静态链表,L.r[0]为头结点*/
  107. {
  108. int i;
  109. addr f,r;
  110. for(i=0;i<(*L).keynum;i++) /*由低位到高位依次对各keyword进行分配和收集*/
  111. {
  112. Distribute((*L).data,i,f,r); /*第i趟分配*/
  113. Collect((*L).data,f,r); /*第i趟收集*/
  114. printf("第%d趟收集后:",i+1);
  115. PrintList2(*L);
  116. }
  117. }
  118.  
  119. void main()
  120. {
  121. DataType d[N]={268,126,63,730,587,184};
  122. SList L;
  123. InitList(&L,d,N);
  124. printf("待排序元素个数是%d个,keyword个数为%d个\n",L.length,L.keynum);
  125. printf("排序前的元素:\n");
  126. PrintList2(L);
  127. printf("排序前的元素的存放位置:\n");
  128. PrintList(L);
  129. RadixSort(&L);
  130. printf("排序后元素的存放位置:\n");
  131. PrintList(L);
  132. system("pause");
  133. }
  134. void PrintList(SList L)
  135. /*按数组序号形式输出静态链表*/
  136. {
  137. int i,j;
  138. printf("序号 keyword 地址\n");
  139. for(i=1;i<=L.length;i++)
  140. {
  141. printf("%2d ",i);
  142. for(j=L.keynum-1;j>=0;j--)
  143. printf("%c",L.data[i].key[j]);
  144. printf(" %d\n",L.data[i].next);
  145. }
  146. }
  147. void PrintList2(SList L)
  148. /*按链表形式输出静态链表*/
  149. {
  150. int i=L.data[0].next,j;
  151. while(i)
  152. {
  153. for(j=L.keynum-1;j>=0;j--)
  154. printf("%c",L.data[i].key[j]);
  155. printf(" ");
  156. i=L.data[i].next;
  157. }
  158. printf("\n");
  159. }

_DataStructure_C_Impl:基数排序的更多相关文章

  1. 算法与数据结构(十七) 基数排序(Swift 3.0版)

    前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...

  2. 排序算法----基数排序(RadixSort(L))单链表智能版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  3. 排序算法----基数排序(RadixSort(L,max))单链表版本

    转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...

  4. 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)

    如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...

  5. 基本排序算法——基数排序java实现

    基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...

  6. 数据结构作业之用队列实现的基数排序(Java版)

    题目: 利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第1和第2条进行说明)和队列的存储方式(第3条进行说明)有如下的要求: 1)当数据序列是整数类型的数据的时候,数据序列 ...

  7. 基数排序 java 实现

    基数排序 java 实现 Wikipedia: Radix sort geeksforgeeks: Radix sort 数学之美番外篇:快排为什么那样快 Java排序算法总结(八):基数排序 排序八 ...

  8. 【UVA 11462】 Age Sort(基数排序)

    题 题意 给你最多2000000个数据,大小是1到99的数,让你排序输出. 分析 快排也可以过.不过这题本意是要基数排序(桶排序),就是读入年龄age, a[age]++,然后输出时,从1到99岁(看 ...

  9. Hark的数据结构与算法练习之基数排序

    算法说明 基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊).这个我有写,请点击. OK,现在你肯定已经熟悉了计数排序,那么我就来 ...

随机推荐

  1. [Apple开发者帐户帮助]三、创建证书(6)创建创建VoIP服务证书

    VoIP:基于IP的语音传输(英语:Voice over Internet Protocol,缩写为VoIP)是一种语音通话技术,经由网际协议(IP)来达成语音通话与多媒体会议,也就是经由互联网来进行 ...

  2. Git 和 Redis 的基本认识

    一: Git 二: Redis

  3. 修改CAS源码是的基于DB的认证方式配置更灵活

    最近在做CAS配置的时候,遇到了数据源不提供密码等数据的情况下,怎样实现密码输入认证呢? 第一步:新建Java项目,根据假面算法生成CAS加密工具 出于保密需要不提供自定义的加密工具,在您的实际项目中 ...

  4. spring事务回滚问题

    刚刚接到一个上家公司同事的一个电话,问我为什么service方法事务不会滚了,日志打印了,调用webservice报错. 我让他把这个调用执行webservice的方法截图发给我,如下:   publ ...

  5. Vue掉坑记

    本文章汇总学习过程中掉入和不理解的坑,会持续更新,请保持关注 1.过滤器类 搜索过滤 2.修饰符 修饰符汇总 3.webpack webpack+vuecli打包路径 4.Vue后台管理框架 组件后台 ...

  6. C语言笔记(一)

    笑话一枚:程序员 A:“哥们儿,最近手头紧,借点钱?”程序员 B:“成啊,要多少?”程序员 A:“一千行不?”程序员 B:“咱俩谁跟谁!给你凑个整,1024,拿去吧.” =============== ...

  7. 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0

    前言:项目开发用到了Redis,但是在调试Redis数据的时候,没有一款通用的可视化管理工具.在网络找了一些,但是感觉功能上都不尽人意,于是决定抽出一点时间,开发一个用起来顺手的Redis管理工具.秉 ...

  8. WinDbg使用

    1.抓dump文件 程序崩溃(crash)的时候, 为了以后能够调试分析问题, 可以使用WinDBG要把当时程序内存空间数据都保存下来,生成的文件称为dump 文件. 步骤: 1) 打开WinDBG并 ...

  9. Tinyxml2学习

    转自http://www.360doc.com/content/13/1223/16/3684846_339528825.shtml,尊重原文 什么是XML? XML全称EXtensible Mark ...

  10. Js构造对象-添加方法的三种方式

    Js构造函数添加方法有多种方案,来看一个混合方式构造函数的例子:申明person构造函数,有两个属性,name,qq.在原型上添加方法showname.这是最常用的方法. <script> ...