| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 803 人关注过本帖
标题:求助:箱排序问题
只看楼主 加入收藏
kangloom
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2007-1-3
收藏
 问题点数:0 回复次数:8 
求助:箱排序问题
箱排序
【问题描述】:假设一个链表中包含了一个班级内所有学生的信息,每个结点含有以下
数据域:学号、姓名、各门课成绩以及平均分(假定所有的分数均为0-100的整数),设计程序用箱排序对指定的成绩排序,并输出排序结果。
【基本要求】:
(1)每个箱子(0-100)描述成一个链表;
(2)能够从欲排序链表的首部开始,逐个删除每个结点,并把所删除的结点放入适当的箱子中。
(3)收集并链接每个箱子中的结点,产生一个排序的链表并输出结果。

哪位大虾帮帮我~马上就要交了~谢了哈~
2007-01-03 09:39
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 
你先自己写,写不来,再把代码贴上来.
提示:设置101个箱子,即一个箱子数组chest[101],每个箱子是一链表,分别代表0-100这101个分.
遍历班级学生信息的时候,把学生分数(假设为mark)当作下标收集到chest[mark]里面,
最后新建一个链表,再按chest[]顺序,依次链入chest[i]里面的全部元素就行了。
ps:箱排序的复杂度为o(n),但它所需要的辅助空间太大,平常用的时候一般选择快排.

对不礼貌的女生收钱......
2007-01-03 12:36
没牙的狼
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-4-23
收藏
得分:0 

#include<stdio.h>
#include<stdlib.h>
#define Max 101
typedef struct List
{

int number;
int Chinese;
int English;
int Match;
}SeqList;
typedef struct Link
{
SeqList chest[Max];
int length;
}LinkList;
LinkList *CreatChest()
{
LinkList *Q;

int i;
Q=(LinkList*)malloc(sizeof(LinkList));
for(i=1;i<101;i++)
{

Q->chest[i].number=i;
Q->chest[i].Chinese=rand()%100;
Q->chest[i].English=rand()%100;
Q->chest[i].Match=rand()%100;

}
Q->length=i;
return Q;
}
void print(LinkList *Q,int x)
{
int i;
for(i=1;i<Q->length;i++)
{
printf("%3d",Q->chest[i].number);
switch(x)
{
case 1:printf("%4d",Q->chest[i].Chinese);break;
case 2:printf("%4d",Q->chest[i].English);break;
case 3:printf("%4d",Q->chest[i].Match);break;
}
printf("\n");
}

}
void ArrangementScore(LinkList *Q,int x)
{
int i,j;

switch(x)
{
case 1:for(i=2;i<Q->length;i++)
{

if(Q->chest[i].Chinese<Q->chest[i-1].Chinese)
{
Q->chest[0].Chinese=Q->chest[i].Chinese;
for(j=i-1;Q->chest[0].Chinese<Q->chest[j].Chinese;j--)
{
Q->chest[j+1]=Q->chest[j];
Q->chest[j]=Q->chest[0];
}
}
}break;
case 2:for(i=2;i<Q->length;i++)
{

if(Q->chest[i].English<Q->chest[i-1].English)
{
Q->chest[0].Chinese=Q->chest[i].Chinese;
for(j=i-1;Q->chest[0].English<Q->chest[j].English;j--)
{
Q->chest[j+1]=Q->chest[j];
Q->chest[j]=Q->chest[0];
}
}
}break;
case 3:for(i=2;i<Q->length;i++)
{

if(Q->chest[i].Match<Q->chest[i-1].Match)
{
Q->chest[0].Match=Q->chest[i].Match;
for(j=i-1;Q->chest[0].Match<Q->chest[j].Match;j--)
{
Q->chest[j+1]=Q->chest[j];
Q->chest[j]=Q->chest[0];
}
}
}break;
}
}
void main()
{
int x;
LinkList *Q;
Q=CreatChest();
printf("\n请输入查询项目:语文1,英语2,数学3\n");
scanf("%d",&x);
ArrangementScore(Q,x);
print(Q,x);
}
我试着写了以下,排序时但有错误,可能对题理解的不够清楚.


2007-01-04 09:46
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

2楼你写的不叫箱排序...
箱排序要借助箱子,把东西按下标往箱子里面填东西。并不是如你所写的。
建议再去好好学学数据结构,按着你的程序修改了,
下面的程序并没有对箱子收集到原数组中,直接按顺序打印出来。
[CODE]#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 5
typedef struct SUBJECT
{
int number;
int Chinese;
int English;
int Math;
double average;
}Subject;
typedef struct NODE
{
Subject sub;
struct NODE *next;
}Node;
typedef struct
{
Node *head[101];
}chest;
chest Chest;
void insert(int index,Subject info)
{
Node *p=(Node *)malloc(sizeof(Node));
p->sub=info;
p->next=Chest.head[index]->next;
Chest.head[index]->next=p;
}
int main()
{
Subject subject[N];
int i,selection;
srand(time(NULL));
for(i=0;i<101;Chest.head[i]=(Node *)malloc(sizeof(Node)),Chest.head[i]->next=NULL,i++);
for(i=0;i<N;i++)
{
subject[i].number=i+1;
subject[i].Chinese=rand()%101;
subject[i].English=rand()%101;
subject[i].Math=rand()%101;
subject[i].average=(subject[i].Chinese+subject[i].English+subject[i].Math)/3.;
}
printf("想按什么排序:语文1,英语2,数学3\n");
scanf("%d",&selection);
switch(selection)
{
case 1:
for(i=0;i<N;i++)
insert(subject[i].Chinese,subject[i]);
break;
case 2:
for(i=0;i<N;i++)
insert(subject[i].English,subject[i]);
break;
case 3:
for(i=0;i<N;i++)
insert(subject[i].Math,subject[i]);
break;
}
for(i=0;i<101;i++)
{
Node *p=Chest.head[i]->next;
while(p)
{
printf("%04d ",p->sub.number);
printf("%4d",p->sub.Chinese);
printf("%4d",p->sub.English);
printf("%4d ",p->sub.Math);
printf("%.1lf\n",p->sub.average);
p=p->next;
}
}
return 0;
}[/CODE]


对不礼貌的女生收钱......
2007-01-04 11:06
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

错了,是3楼。不是2楼,2楼是我呃...


对不礼貌的女生收钱......
2007-01-04 11:09
没牙的狼
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-4-23
收藏
得分:0 
哈哈,我看看啊,我真不知道箱排序的意思,学习了

2007-01-04 17:22
没牙的狼
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-4-23
收藏
得分:0 

这个是靠什么排序的?我没找到排序的句字


2007-01-04 18:22
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
收藏
得分:0 

用这个例子来说:
总共有101个箱子,这些箱子按下标分别只能放0分,1分,2分,...,100分.
假设按数学排序,一个学生数学考78分,就把他往78号箱子里扔进去,依次扔完学生。
然后从0号箱子开始,到100号箱子,依次取里面的学生元素,这样,取出来的序列自然是有序的了.


对不礼貌的女生收钱......
2007-01-04 18:53
没牙的狼
Rank: 1
等 级:新手上路
帖 子:49
专家分:0
注 册:2006-4-23
收藏
得分:0 

明白了,感谢啊


2007-01-04 19:38
快速回复:求助:箱排序问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.082601 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved