_DataStructure_C_Impl:基数排序
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#define MaxNumKey 6 /*keyword项数的最大值*/
#define Radix 10 /*keyword基数,此时是十进制整数的基数*/
#define MaxSize 1000
#define N 6
typedef int KeyType; /*定义keyword类型*/
typedef struct
{
KeyType key[MaxNumKey]; /*keyword*/
int next;
}SListCell; /*静态链表的结点类型*/ typedef struct
{
SListCell data[MaxSize]; /*存储元素,data[0]为头结点*/
int keynum; /*每一个元素的当前keyword个数*/
int length; /*静态链表的当前长度*/
}SList; /*静态链表类型*/
typedef int addr[Radix]; /*指针数组类型*/ typedef struct
{
KeyType key; /* keyword项 */
}DataType; void PrintList(SList L);
void PrintList2(SList L);
void InitList(SList *L,DataType d[],int n);
int trans(char c);
void Distribute(SListCell data[],int i,addr f,addr r);
void Collect(SListCell data[],addr f,addr r);
void RadixSort(SList *L);
void InitList(SList *L,DataType a[],int n)
/* 初始化静态链表L(把数组D中的数据存于L中) */
{
char ch[MaxNumKey],ch2[MaxNumKey];
int i,j,max=a[0].key;
for(i=1;i<n;i++) /*将最大的keyword存入max*/
if(max<a[i].key)
max=a[i].key;
(*L).keynum=(int)(log10((float)max))+1; /*求keyword的个数*/
(*L).length=n; /*待排序个数*/
for(i=1;i<=n;i++)
{
itoa(a[i-1].key,ch,10); /*将整型转化为字符,并存入ch*/
for(j=strlen(ch);j<(*L).keynum;j++) /*假设ch的长度<max的位数,则在ch前补'0'*/
{
strcpy(ch2,"0");
strcat(ch2,ch);
strcpy(ch,ch2);
}
for(j=0;j<(*L).keynum;j++) /*将每一个keyword的各个位数存入key*/
(*L).data[i].key[j]=ch[(*L).keynum-1-j];
}
for(i=0;i<(*L).length;++i) /*初始化静态链表*/
(*L).data[i].next=i+1;
(*L).data[(*L).length].next=0;
} int trans(char c)
/*将字符c转化为相应的整数*/
{
return c-'0';
}
void Distribute(SListCell data[],int i,addr f,addr r)
/*为data中的第i个keywordkey[i]建立Radix个子表,使同一子表中元素的key[i]同样*/
/*f[0..Radix-1]和r[0..Radix-1]分别指向各个子表中第一个和最后一个元素*/
{
int j,p;
for(j=0;j<Radix;j++) /*将各个子表初始化为空表*/
f[j]=0;
for(p=data[0].next;p;p=data[p].next)
{
j=trans(data[p].key[i]); /*将相应的keyword字符转化为整数类型*/
if(!f[j]) /*f[j]是空表。则f[j]指示第一个元素*/
f[j]=p;
else
data[r[j]].next=p;
r[j]=p; /*将p所指的结点插入第j个子表中*/
}
} void Collect(SListCell data[],addr f,addr r)
/*按key[i]将f[0..Radix-1]所指各子表依次链接成一个静态链表*/
{
int j,t;
for(j=0;!f[j];j++); /*找第一个非空子表。succ为求后继函数*/
data[0].next=f[j];
t=r[j]; /*r[0].next指向第一个非空子表中第一个结点*/
while(j<Radix-1)
{
for(j=j+1;j<Radix-1&&!f[j];j++); /*找下一个非空子表*/
if(f[j]) /*将非空链表连接在一起*/
{
data[t].next=f[j];
t=r[j];
}
}
data[t].next=0; /*t指向最后一个非空子表中的最后一个结点*/
} void RadixSort(SList *L)
/*对L进行基数排序,使得L成为按keyword非递减的静态链表,L.r[0]为头结点*/
{
int i;
addr f,r;
for(i=0;i<(*L).keynum;i++) /*由低位到高位依次对各keyword进行分配和收集*/
{
Distribute((*L).data,i,f,r); /*第i趟分配*/
Collect((*L).data,f,r); /*第i趟收集*/
printf("第%d趟收集后:",i+1);
PrintList2(*L);
}
} void main()
{
DataType d[N]={268,126,63,730,587,184};
SList L;
InitList(&L,d,N);
printf("待排序元素个数是%d个,keyword个数为%d个\n",L.length,L.keynum);
printf("排序前的元素:\n");
PrintList2(L);
printf("排序前的元素的存放位置:\n");
PrintList(L);
RadixSort(&L);
printf("排序后元素的存放位置:\n");
PrintList(L);
system("pause");
}
void PrintList(SList L)
/*按数组序号形式输出静态链表*/
{
int i,j;
printf("序号 keyword 地址\n");
for(i=1;i<=L.length;i++)
{
printf("%2d ",i);
for(j=L.keynum-1;j>=0;j--)
printf("%c",L.data[i].key[j]);
printf(" %d\n",L.data[i].next);
}
}
void PrintList2(SList L)
/*按链表形式输出静态链表*/
{
int i=L.data[0].next,j;
while(i)
{
for(j=L.keynum-1;j>=0;j--)
printf("%c",L.data[i].key[j]);
printf(" ");
i=L.data[i].next;
}
printf("\n");
}
_DataStructure_C_Impl:基数排序的更多相关文章
- 算法与数据结构(十七) 基数排序(Swift 3.0版)
前面几篇博客我们已经陆陆续续的为大家介绍了7种排序方式,今天博客的主题依然与排序算法相关.今天这篇博客就来聊聊基数排序,基数排序算法是不稳定的排序算法,在排序数字较小的情况下,基数排序算法的效率还是比 ...
- 排序算法----基数排序(RadixSort(L))单链表智能版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 排序算法----基数排序(RadixSort(L,max))单链表版本
转载http://blog.csdn.net/Shayabean_/article/details/44885917博客 先说说基数排序的思想: 基数排序是非比较型的排序算法,其原理是将整数按位数切割 ...
- 浅谈C++之冒泡排序、希尔排序、快速排序、插入排序、堆排序、基数排序性能对比分析之后续补充说明(有图有真相)
如果你觉得我的有些话有点唐突,你不理解可以想看看前一篇<C++之冒泡排序.希尔排序.快速排序.插入排序.堆排序.基数排序性能对比分析>. 这几天闲着没事就写了一篇<C++之冒泡排序. ...
- 基本排序算法——基数排序java实现
基数排序 package basic.sort; import java.util.Arrays; import java.util.Random; public class RadixSort { ...
- 数据结构作业之用队列实现的基数排序(Java版)
题目: 利用队列实现对某一个数据序列的排序(采用基数排序),其中对数据序列的数据(第1和第2条进行说明)和队列的存储方式(第3条进行说明)有如下的要求: 1)当数据序列是整数类型的数据的时候,数据序列 ...
- 基数排序 java 实现
基数排序 java 实现 Wikipedia: Radix sort geeksforgeeks: Radix sort 数学之美番外篇:快排为什么那样快 Java排序算法总结(八):基数排序 排序八 ...
- 【UVA 11462】 Age Sort(基数排序)
题 题意 给你最多2000000个数据,大小是1到99的数,让你排序输出. 分析 快排也可以过.不过这题本意是要基数排序(桶排序),就是读入年龄age, a[age]++,然后输出时,从1到99岁(看 ...
- Hark的数据结构与算法练习之基数排序
算法说明 基数排序是基于计数排序的,所以看这个之前要先看一下计数排序对于理解基数排序是很有帮助的(发现计数和基数的音节几乎一致啊).这个我有写,请点击. OK,现在你肯定已经熟悉了计数排序,那么我就来 ...
随机推荐
- ASP.NET Core 多环境
ASP.NET Core 支持在多个环境中管理应用程序,如开发(Development),预演(Staging)和生产(Production).环境变量用来指示应用程序正在运行的环境,允许应用程序适当 ...
- 消除svn选定(checkout)桌面上文件显示一大堆问号。
图片: 解决方法一: 桌面右键选择TortoiseSVN——>点击Settings,如下图,选中Icon Overlays(图标覆盖),去勾选Fixed drives(本地磁盘),点击确定,按F ...
- System.net.mail发送电子邮件
之前做的实现发送邮件的功能,基于System.net.mail,在本地测试是可以发送邮件的,发布到服务器上发送不了邮件,后来发现STMP默认使用25端口收发邮件,服务器封掉25了端口,导致发送邮件失败 ...
- codechef MAY18 div2 部分题解
T1 https://www.codechef.com/MAY18B/problems/RD19 刚开始zz了,其实很简单. 删除一个数不会使gcd变小,于是就只有0/1两种情况 T2 https:/ ...
- js基础标签用法
js是脚本语言,开始标签<script type="text/javascript">.......结束标签</script>.script通常放在< ...
- VMWare 安装Centos 6.9
1.新建虚拟机 (1)点击文件-->新建虚拟机 (2)选择 自定义(高级)--> 下一步 (3)选择Workstation 12.0 --> 下一步 (4)选择 稍后安装操作系统 - ...
- 【PostgreSQL-9.6.3】表继承
表继承是PostgreSQL特有的,子表可以从父表中继承字段和一些属性.例如: --创建一张表“persons”作为父表: test=# create table persons ( test(# i ...
- NLP:单词嵌入Word Embeddings
深度学习.自然语言处理和表征方法 原文链接:http://blog.jobbole.com/77709/ 一个感知器网络(perceptron network).感知器 (perceptron)是非常 ...
- nvcc fatal : Unsupported gpu architecture 'compute_11'
使用VS编译OpenCV编译源代码时候,对Cmake生成的工程文件编译,会出现 nvcc fatal : Unsupported gpu architecture 'compute_11' 问题.原 ...
- 实现Android-JNI本地C++调试
1. 原文链接:NDK单步调试方法 如有问题或者版权要求,请拜访原作者或者通知本人. 最近为了性能需求,开始搞JNI,白手起搞真心不容易.中间差点崩溃了好几次,最终总算得到一点心得. JN ...