您的位置:首页 > 理论基础 > 数据结构算法

数据结构——链式基数排序

2013-09-03 16:43 323 查看
#include <iostream>
using namespace std;

#define MAX_NUM_OF_KEY 8        //关键字项数的最大值
#define RADIX    10            //关键字基数,此时是十进制整数的基数
#define MAX_SPACE 10000
typedef int DataType ;
typedef struct
{
int data;        //数据,如571
DataType keys[MAX_NUM_OF_KEY];        //每个数据的所有关键字,571的5,7,1
int  next;
}SLCell;    //静态链表的节点类型

typedef struct    Sllist
{
SLCell *R;    //静态链表的可利用空间,r[0]为头结点
int recnum;        //静态链表的当前长度
int keynum;        //当前数据的关键字个数
}Sllist, * SLList;    //静态链表类型

typedef int ArrType[RADIX];        //指针数组类型,声明两个指针数组,一个头指针,一个尾指针

////////////////////////////////////////////////////////////////////////////////
/*
ArrType    front[RADIX]                                                ArrType    end[RADIX]
|                                                |
f[0]        |------>[930]<----------------------------------|        e[0]
|                                                |
f[1]        |-->                                         <--|        e[1]
|                                                |
f[2]        |-->                                         <--|        e[2]
|                                                |
f[3]        |------>[063]-->[083]<--------------------------|        e[3]
|                                                |
f[4]        |------>[184]<----------------------------------|        e[4]
|                                                |
f[5]        |------>[505]<----------------------------------|        e[5]
|                                                |
f[6]        |-->                                         <--|        e[6]
|                                                |
f[7]        |-->                                         <--|        e[7]
|                                                |
f[8]        |------>[278]-->[008]<--------------------------|        e[8]
|                                                |
f[9]        |------>[109]-->[589]-->[269]<------------------|        e[9]

*/
//////////////////////////////////////////////////////////////////////////////////

void creatList(SLList &SLL)
{

int key, i=1,j;
cout<<"输入要进行排序的数据:"<<endl;
cin>>key;
while(key!=0)
{
SLL->R[i].data = key;
for(j = 1; j <= SLL->keynum; j++)
{
SLL->R[i].keys[j] = key % 10;
key /= 10;
}
SLL->R[i-1].next=i++;
cin>>key;
}
SLL->recnum = i-1;
SLL->R[SLL->recnum].next=0;
}

void print(SLList &SLL)
{
for(int p=SLL->R[0].next; p; p=SLL->R[p].next)
{
cout<<SLL->R[p].data<<"  ";
}
cout<<endl;
}

void distribute(SLCell *R, int i, ArrType front, ArrType end)
{
//静态链表L的R域中记录已按(keys[0]...keys[i-1]有序)。
//本算法按第i个关键字keys[i]建立RADIX个子表,使同一子表中记录的keys[i]相同。
//front[0...RADIX-1]和end[0...RADIX-1]分别指向各子表中第一个和最后一个记录。
for(int j=0; j<RADIX; ++j)
front[j] = 0;        //各子表初始化为空表
for(int p=R[0].next; p; p=R[p].next)
{
j=R[p].keys[i];            //映射第i个关键字
if(!front[j])
front[j] = p;        //若front[j]为空,则把记录连接到front[j]的头指针上
else
R[end[j]].next = p;    //若front[j]的头指针已经连接过了,说明已j为关键字的数据已经有了,
//这时把上一个以j为关键字的数据指向当前的这个数,即下标为p的数据
end[j] = p;        //尾指针重新指到每次更新的数据上
}
}//distribute

void collect(SLCell *R, int i, ArrType front, ArrType end)
{
//本算法按keys[i]自小到大地将f[0...RADIX-1]所指各子表依次链接成为一个链表
for(int j=0; !front[j]; j++)
;                    //找到第一个不为空的子表
R[0].next=front[j];            //重整静态链表
int k=end[j];                    //k为当前子表的尾指针
while(j<RADIX)
{
for(++j; j<RADIX; j++)
if(front[j])        //找下一个非空子表
{
R[k].next=front[j];        //连接
k=end[j];
}
}
R[k].next=0;                    //k指向最后一个非空子表的尾指针
}//collect

int main()
{
SLList SLL;
SLL=(SLList)malloc(MAX_SPACE*sizeof(Sllist));
SLL->R=(SLCell *)malloc(MAX_SPACE*sizeof(SLCell));
SLL->recnum=0;
SLL->keynum=3;

creatList(SLL);
cout<<"排序前:"<<endl;
print(SLL);

ArrType front,end;
for(int i = 1; i <= SLL->keynum; i++)    //按LSD法对各关键字进行分配和收集
{
distribute(SLL->R, i,front,end);    //第i趟分配
collect(SLL->R, i,front,end);        //第i趟收集
cout<<"第"<<i<<"分配和收集:"<<endl;
print(SLL);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: