#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:基数排序的更多相关文章

  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. 洛谷P1725琪露诺(单调队列优化dp)

    P1725 琪露诺 题目描述 在幻想乡,琪露诺是以笨蛋闻名的冰之妖精.某一天,琪露诺又在玩速冻青蛙,就是用冰把青蛙瞬间冻起来.但是这只青蛙比以往的要聪明许多,在琪露诺来之前就已经跑到了河的对岸.于是琪 ...

  2. 通过DOM实现点击隐藏父元素

    HTML代码简单如下: <ul id='ul1'> <li><a href="javascript:">1</a></li&g ...

  3. UIView动画基础

    1 Position 平移 [UIView animateWithDuration:1.0 animations:^{ _blueView.centerX = self.view.width -100 ...

  4. struts2拦截器(四)

    struts2拦截器原理: 当请求action时,struts2会查找配置文件,并根据配置实例化相对的 拦截器对象,然后串成一个列表,然后一个一个的调用列表中的拦截器. 比如:某些页面必须登录才可以访 ...

  5. centos下使用shell+expect远程登录主机

    # 安装expect yum install expect # 新建脚本文件running #!/usr/bin/expect spawn /usr/bin/ssh root@114.114.114. ...

  6. JavaScript Array 整理 - 元素操作

    整理一下Array对象中针对元素操作的方法. 分别是: concat (组合数组) join(数组转字符串) pop(删除最后一个元素) shift(删除第一个元素) push(在数组尾部添加新元素) ...

  7. nodejs脚手架express-generator

    1.安装生成器 npm install express-generator -g 2. 创建名称为APP的应用: express my-project 3.安装依赖包 cd my-project np ...

  8. Windows7 win10 系统如何强制禁用驱动程序签名

    转载自奇兔 Win7 64位系统禁用驱动程序签名强制    Win7系统是比较稳定的一款系统,也是最多人在使用的一款系统.当我们在Win7系统中安装驱动程序的时候,对安装的驱动程序需要数字签名,否则驱 ...

  9. 在64位WindowsServer2012R2中安装Oracle10g第二版(10.2.0.4.0)-20160106

      1.操作系统版本 用于安装数据库的操作系统镜像文件名为:cn_windows_server_2012_r2_vl_with_update_x64_dvd_6052729.iso 安装DataCen ...

  10. C#自动缩进排列代码的快捷键 c# 代码重新排版 变整齐

    C#自动缩进排列代码的快捷键:  ctrl + k + d 1.小技巧, 可以把最后一个}去掉, 重新写下,就可以达到排版的效果. 2.快捷键:编辑-高级-设置文档的格式 快捷键Ctrl+E,D,设置 ...