C++编程高手们请进!!
由于刚学C++,对于基数排序不是很了解,我在网上搜索的基数排序算法大多不能运行而且很复杂,很少有解释,所以恳求高手们给一个基数排序算法的源码,比如要排序 {123,22,43,56,222,2},括号内的仅供参考。多谢了!注意:我需要的是一个可运行的基数排序算法的源码,而不是其它,请高手们理解!不要只发表看法而没有算法!谢谢!
由于刚学C++,对于基数排序不是很了解,我在网上搜索的基数排序算法大多不能运行而且很复杂,很少有解释,所以恳求高手们给一个基数排序算法的源码,比如要排序 {123,22,43,56,222,2},括号内的仅供参考。多谢了!注意:我需要的是一个可运行的基数排序算法的源码,而不是其它,请高手们理解!不要只发表看法而没有算法!谢谢!
答案:#define maxsize 20
#include<conio.h>
typedef struct {
int key;
}rcdtype;
typedef struct {
rcdtype r[maxsize+1];
int length;
}sqlist;
/*表的创建*/
void create(sqlist *l)
{int i;
printf("\
To create a list,tell me the length:");
scanf("%d",&l->length);
printf("Now input the list:");
for(i=1;i<=l->length;i++)
scanf("%d",&l->r[i].key);
}
/*表的输出*/
void play(sqlist l)
{int i;
printf("The list is:");
for(i=1;i<=l.length;i++)
printf("%d ",l.r[i].key);
}
/*基数排序*/
#define max_num_of_key 8
#define radix 10
#define max_space 100
typedef struct{
char keys[max_num_of_key];
int next;
}slcell;
typedef struct{
slcell r[max_space];
int keynum;
int recnum;
}sllist;
typedef int arraytype[radix];
void transform1(sqlist s,sllist *l)
{int i;
l->keynum=3;l->recnum=s.length;
for(i=1;i<=s.length;i++)
{l->r[i].keys[2]=s.r[i].key/100;
l->r[i].keys[1]=s.r[i].key/10-10*l->r[i].keys[2];
l->r[i].keys[0]=s.r[i].key%10;
}
for(i=0;i<l->recnum;i++)
l->r[i].next=i+1;
l->r[i].next=0;
}
void transform2(sqlist *s,sllist l)
{int i,j;
for(i=1,j=l.r[0].next;i<=l.recnum;i++,j=l.r[j].next)
s->r[i].key=100*l.r[j].keys[2]+10*l.r[j].keys[1]+l.r[j].keys[0];
}
void distribute(slcell *r,int i,arraytype f,arraytype e)
{int j,p;
for(j=0;j<radix;j++){f[j]=0;e[j]=0;}
for(p=r[0].next;p;p=r[p].next)
{j=r[p].keys[i];
if(!f[j])f[j]=p;
else r[e[j]].next=p;
e[j]=p;
}
}
void collect(slcell *r,arraytype f,arraytype e)
{int j,t;
for(j=0;!f[j];j++);
r[0].next=f[j];t=e[j];
while(j<radix)
{for(j++;j<radix-1&&!f[j];j++);
if(f[j]&&j<radix){r[t].next=f[j];t=e[j];}
}
r[t].next=0;
}
void radixsort(sqlist *s)
{sllist l;
arraytype f,e;
int i;
transform1(*s,&l);
for(i=0;i<l.keynum;i++)
{distribute(l.r,i,f,e);
collect(l.r,f,e);
}
transform2(s,l);
}
/*测试主函数*/
main()
{int c=1;
sqlist l;
clrscr();
create(&l);
radixsort(&l);
play(l);
getch();
}
不知道你有没有学过C语言,这是我用C语言编的.我不是计算机专业的,只学过这一种语言,只能用它了.刚刚做出来,与你分享一下.保证在TC环境下没有问题.这个程序几乎就是把严蔚敏那本数据结构上的算法改成C语言就完的,没有什么新意.
前面是创建了一个线性表,而这个线性表是不能直接用于基数排序的,所以用transform1和transform2变成和变回基数排序所用的关键字串的形式,有点繁琐,应该是可以真接创建一个那样的数组,但是似乎就不实用了.
仔细看看程序你会发现,这个小排序,只能对付1000以内数字的排序,多了就不行了.不过,要扩充并不困难.
上一个:C++中返回值是什么意思
下一个:用c++编写电梯程序怎么写