_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,现在你肯定已经熟悉了计数排序,那么我就来 ...
随机推荐
- 原生JS---1
js的历史 在上个世纪的1995年,当时的网景公司正凭借其Navigator浏览器成为Web时代开启时最著名的第一代互联网公司. 由于网景公司希望能在静态HTML页面上添加一些动态效果,于是叫Bren ...
- Mvc程序字体加载失败问题
在我们开发的asp.net-mvc项目中,有时会出现字体加载失败的现象,但是一检查字体文件目录,发现文件目录都是存在的且有效的,这是为何呢?原来需要再web.config文件中添价少许配置代码就搞定. ...
- 网络流模板(模板题:POJ1273)
模板题:POJ1273 EK: #include <queue> #include <cstdio> #include <cstring> #include < ...
- indeed 5.13 第二次网测
题目描述,我找不见了,大概写一下想法和代码吧. 1. 没有看 2. 由于数据范围很小,就是简单的枚举,求全排列,然后更新答案. #include<bits/stdc++.h> #defin ...
- Struts2 在登录拦截器中对ajax请求的处理
前言: 由于ajax请求不像http请求,可以直接进行页面跳转,你返回的所有东西,ajax都只会识别为一个字符串. 之前尝试的方法是在拦截器中返回一个标识给ajax,然后再在每一个ajax请求成功之后 ...
- "etc/profile" E212: Can't open file for writing
今天安装Java环境,出现如下错误: "etc/profile" E212: Can't open file for writing 这是安装到本地JDK路径不正确导致.怎么办呢? ...
- Windows7环境下Composer 安装包的Cache目录位置
http://segmentfault.com/a/1190000000355928 https://getcomposer.org/doc/ 要说Composer的用法,以后再说,现在只记录wind ...
- 怪异的Ubuntu
怪异的Ubuntu 简单记录ubuntu上出现并且网上不好找到甚至压根找不到解决方案的疑难杂症. lvextend扩展逻辑卷的容量不能被系统检测到 问题发生在Ubuntu 16.04系统上. 逻辑卷/ ...
- 【Linux】创建逻辑卷管理(LVM)
LVM是对磁盘进行分区管理的机制.LVM有很多优点:在线扩容,跨磁盘分区......,缺点:管理相对麻烦.创建LVM的过程如下: LVM是基于普通分区或者整块硬盘来进行的.我们首先把这些存储转换为PV ...
- c#使用RSA进行注册码验证
公司的一个项目快完成了,最后要加上注册验证,翻了n多资料,终于做出来了.现在把体验说一下,以后要用的时候也好找.~~ .Net自带的类库里面有个算法. 这个算法的原理是不对称加密的原理.不对称加密原理 ...