多关键字排序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
多关键字排序
1.程序设计问题描述
多关键字的排序有其一定的实用范围。例如:在进行高考分数处理时,除了需对总分进行排序外,不同的专业对单科分数的要求不同,因此尚需在总分相同的情况下,按用户提出的单科分数的次序要求排出考生录取的次序。
2.基本要求
(1)假设待排序的记录数不超过10000,表中记录的关键字数不超过5,各个关键字的范围均为0至100。按用户给定的进行排序的关键字的优先关系,输出排序结果。
(2)约定按LSD法进行多关键字的排序。在对各个关键字进行排序时采用两种策略:其一是利用稳定的内部排序法,其二是利用"分配"和"收集"的方法。并综合比较这两种策略。
(3)测试数据由随机数生成器产生。
#include
#include
#include
#include
#include
#define radix 11 //基数
using namespace std;
typedef struct node //定义结构体
{
int key[5]; //数据域
struct node *next; //指针域
}*Score,Lnode;
Score RandData(Score &L,int n) //随机生成n个数据并保存到链表L中,返回链表头指针
{
Score p,q;
L=(Score)malloc(sizeof(Lnode)); //创建带头结点的链表L
L->next=NULL;
q=L;
srand(time(0));
cout<<"输入你所需的数据个数:";
cin>>n;
cout<
{
p=(Score)malloc(sizeof(Lnode));
for(int j=0;j<5;j++)
{
p->key[j]=rand()%101; //对每个关键字随机产生0--100的数字
}
q->next=p;
q=p;
}
p->next=NULL; //最后一个节点的指针指向空
q=L->next;
while(q) //将数据写入文件new.txt,以及在屏幕输出
{
for(int k=0;k<5;k++)
{
cout<
}
cout<
}
return L; //返回结构体指针
}
Score BubbleSort(Score &L) //对链表进行冒泡降序排序,返回指针L
{
Score p,q,s,t,N;
int n;
t=(Score)malloc(sizeof(node));
N=(Score)malloc(sizeof(node));
N->next=L->next; //把N指向链表L
L->next=NULL; //L重新指向空
s=L; //创建新的链表L
while(N->next->next)
{
p=N->next;
q=p->next;
while(q)
{
n=0;
while(p->key[n]==q->key[n]&&n<5) //当前关键字相等则比较下一关键字
{n++;}
if(p->key[n]>q->key[n]) //交换数据域,指针域不变
{
for(int i=0;i<5;i++)
{
t->key[i]=q->key[i];
q->key[i]=p->key[i];
p->key[i]=t->key[i];
}
}
if(q->next==NULL) //当q指向最后一个结点时,将q插入到链表L的尾部
{
s->next=q;
s=s->next;
p->next=NULL;
//p指向最后一个结点
}
p=p->next;
q=q->next;
}
}
s->next=N->next; //将第一个结点插到L的尾部
delete(N); //销毁指针N
return L;
}
Score RadixSort(Score &L) //对链表L的第n个关键字进行基数排序
{
Score head[radix],tail[radix],p,t;
int d,i,j,m;
for(int n=4;n>=0;n--)
{
for(d=1;d<=2;d++)
{
for(i=0;i
p=L->next;
while(p)
{
if(d==1) m=p->key[n]%10; //第一趟取个位分配
else m=p->key[n]/10; //第二趟分配
if(head[m]==NULL) //采用尾插法建立单链表
{
head[m]=p;
tail[m]=p;
}
else
{
tail[m]->next=p;
tail[m]=p;
}
p=p->next; //取下一个待排序元素
}
L->next=NULL;
for(j=radix-1;j>=0;j--) //对每一个链队从大到小进行收集
if(head[j])
{
if(L->next==NULL)
{
L->next=head[j]; //L指向链队头
t=tail[j]; //t指向队尾
}
else
{
t->next=head[j]; //t->next指向下一个链队头
t=tail[j];
}
}
t->next=NULL; //最后一个结点指向空
}
}
return L; //返回L
}
void PrintScore(Score &L) //在屏幕上显示链表
{
Score p;
p=L->next;
while(p)
{
for(int i=0;i<5;i++) //依次输出5个数据
cout<
cout<
}
cout<
void Menu() //菜单
{
int a,b,n;
Score L;
double time;
cout<<"##################################################"<
cout<
{
cin>>b;
if(b==1)
{
cout<
PrintScore(L); //打印结果
}
else if(b==2)
{
RadixSort(L); //调用基数排序
PrintScore(L);
//}
}
else cout<<"选择的操作不存在!!请重新输入(1或者2)"<
}
void main()
{
int c;
do
{
Menu(); //调用菜单
cout<<"结束?输入0,输入其他继续"<
}
while(c!=0) ; //c等于0停止循环
}