_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,现在你肯定已经熟悉了计数排序,那么我就来 ...
随机推荐
- 利用python+tkinter开发一个点名软件
最近上课学生多名字记不住,名册忘记了带,要点名怎么办,好久没有写代码了,于是自己写了个点名软件,记录下吧,第一次接触TK也不是太熟悉,写的不太好,记录下源代码 以后遇到要写桌面软件还是可以耍耍的. t ...
- 【转载】cocos2dx 中 Android NDK 加载动态库的问题
原文地址:http://blog.csdn.net/sozell/article/details/10551309 cocos2dx 中 Android NDK 加载动态库的问题 闲聊 最近在接入各 ...
- c# 官方文档必看
https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history
- 6月10遇到的bug
3.遇到的BUG 1.@Service(version = "1.0.0", interfaceClass = TransactionItemService.clas ...
- javascript执行环境及作用域
执行环境(execution context,为简单起见,有时也成为“环境”)是javascript中最为重要的一个概念.执行环境定义了变量或函数有权访问的其他数据,决定了它们各自的行为.每个执行环境 ...
- Css打造一个简单的静态七巧板
偶然在微博上看到用css写一个七巧板,正好也有一些源代码,于是就试着敲了敲. 主要是利用了css3的transform,实现平移,旋转,变形,直接用看到的代码敲出来之后有些问题,因为宽度上下面绿色的三 ...
- SQL中EXTRACT() 函数
EXTRACT()("提取"的意思) 函数用于返回日期/时间的单独部分,比如年.月.日.小时.分钟等等. 就是返回出来具体的年,月,日 2008-12-29 16:25:46.63 ...
- Windows下VS2013 C++编译测试faster-rcnn
[原创帖!转载请注明出处:http://www.cnblogs.com/LaplaceAkuir/p/6445189.html] 本人最近研究faster-rcnn,在ubuntu成功跑通matlab ...
- 关于layui 下拉框 bug
@for (; i < ; i++) { <option value=</option> } 当value=""时候 自动添加选中样式
- 团体程序设计天梯赛-练习集-L1-036. A乘以B
L1-036. A乘以B 看我没骗你吧 —— 这是一道你可以在10秒内完成的题:给定两个绝对值不超过100的整数A和B,输出A乘以B的值. 输入格式: 输入在第一行给出两个整数A和B(-100 < ...