基数高位优先排序算法
找了很多资料,都找不到关于高位排序的。下面是数据结构书上的低位优先算法。
#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];
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)
{
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; //把上一个以j为关键字的数据指向当前的这个数,即下标为p的数据
end[j]=p; //尾指针重新指到每次更新的数据上
}
}
void MSD(SLCell *R,int i,ArrType front,ArrType end)
{
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; //把上一个以j为关键字的数据指向当前的这个数,即下标为p的数据
end[j]=p; //尾指针重新指到每次更新的数据上
}
for(j=0;!front[j];j++) //找到第一个不为空的子表
{
R[0].next=front[j];
int k=end[j];
R[k].next=0;
i--;
MSD(R,i,front,end);
}
}
void collect(SLCell *R,int i,ArrType front,ArrType end)
{
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指向最后一个非空子表的尾指针
}
请帮忙给出算法。