查询与排序实验报告.docx
《查询与排序实验报告.docx》由会员分享,可在线阅读,更多相关《查询与排序实验报告.docx(10页珍藏版)》请在冰豆网上搜索。
查询与排序实验报告
学院专业班学号
姓名协作者_____________教师评定_________________
实验题目查询与排序
综合实验评分表
指导教师评分标准
序号
评分项目
评分标准
满分
打分
1
完成度
按要求独立完成实验准备、程序调试、实验报告撰写。
20
2
实验内容
(1)完成功能需求分析、存储结构设计;
(2)程序功能完善、可正常运行;
(3)测试数据正确,分析正确,结论正确。
30
3
实验报告
内容齐全,符合要求,文理通顺,排版美观。
40
4
总结
对实验过程遇到的问题能初步独立分析,解决后能总结问题原因及解决方法,有心得体会。
10
实验报告
一、实验目的与要求
1、掌握散列表的构造及实现散列查找;
2、掌握堆排序的算法;
3、综合比较各类排序算法的性能。
二、实验内容
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
#include"windows.h"
#defineMAX20
typedefstruct{
unsignedlongkey;
intresult;
charname[30];}RNode;
RNodet[MAX],r[MAX];
inth(unsignedlongk)/*散列函数*/
{
return((k-3109005700)%11);
}
voidinsert(RNodet[],RNodex)/*插入函数,以线性探查方法解决冲突*/
{
inti,j=0;
i=h(x.key);
while((j=x.key)&&(t[(i+j)%MAX].key>0))
j++;
if(j==MAX)printf("full\n");
i=(i+j)%MAX;
if(t[i].key==0)
{t[i]=x;}
else
{
if(t[i].key==x.key)
printf("记录已存在!
\n");
}
}
intsearch(RNodet[],unsignedlongk)/*插入函数,以线性探查方法解决冲突*/
{
inti,j=0;
i=h(k);
while((j=k)&&(t[(i+j)%MAX].key!
=0))
j++;
i=(i+j)%MAX;
if(t[i].key==k)
return(i);
if(j==MAX)
returnMAX;
else
return(-i);
}
voidsift(RNoder[],intv,intw)
{
inti,j;
RNodea;
i=v;
a=r[i];
j=2*i+1;
while(j<=w)
{
if((jr[j+1].result))
j++;
if(a.result>r[j].result)
{r[i]=r[j];i=j;j=2*j+1;}
elsebreak;
}
r[i]=a;
}
voidsort(RNoder[],intn)
{
inti;
RNodey;
for(i=n/2-1;i>=0;i--)
sift(r,i,n-1);
for(i=n-1;i>0;i--)
{y=r[0];r[0]=r[i];r[i]=y;
printf("学生姓名:
%s\t学生学号:
%u\t学生成绩:
%d\n",r[i].name,r[i].key,r[i].result);
sift(r,0,i-1);
}
printf("学生姓名:
%s\t学生学号:
%u\t学生成绩:
%d\n",r[0].name,r[0].key,r[0].result);
}
intmenu()/*菜单函数*/
{
intselect;
printf("\n\n");
printf("\n");
printf("\t\t*************查找排序实验******************\n");
printf("\t\t*\n");
printf("\t\t*************欢迎进入系统******************\n");
printf("\t\t*menu:
*\n");
printf("\t\t*1.查找*\n");
printf("\t\t*2.排序*\n");
printf("\t\t*0.退出*\n");
printf("\t\t*******************************************\n");
printf("\n");
printf("\t\t\t请输入0--2\n");
printf("\n");
printf("请选择您所要的操作(选择(0)退出):
");
scanf("%d",&select);
getchar();
return(select);
}
voidmain()/*主函数*/
{
inti,s,n,select;
intj=0,m=0;
RNodey;
for(i=0;it[i].key=0;/*初始化*/
for(i=0;i<10;i++)/*导入记录*/
{
switch(i){
case0:
{
RNodex;
x.key=310900***;
strcpy(x.name,"***");
x.result=90;
insert(t,x);
break;}
case1:
{
RNodex;
x.key=31090***1;
strcpy(x.name,"***");
x.result=95;
insert(t,x);
break;}
case2:
{
RNodex;
x.key=3109005***;
strcpy(x.name,"***");
x.result=92;
insert(t,x);
break;}
case3:
{
RNodex;
x.key=31090***;
strcpy(x.name,"***");
x.result=93;
insert(t,x);
break;}
case4:
{
RNodex;
x.key=3109005***;
strcpy(x.name,"***");
x.result=94;
insert(t,x);
break;}
case5:
{
RNodex;
x.key=310900***;
strcpy(x.name,"***");
x.result=91;
insert(t,x);
break;}
case6:
{
RNodex;
x.key=3109005***;
strcpy(x.name,"***");
x.result=96;
insert(t,x);
break;}
case7:
{
RNodex;
x.key=310900***;
strcpy(x.name,"***");
x.result=99;
insert(t,x);
break;}
case8:
{
RNodex;
x.key=310900***;
strcpy(x.name,"***");
x.result=98;
insert(t,x);
break;}
case9:
{
RNodex;
x.key=310900***;
strcpy(x.name,"***");
x.result=97;
insert(t,x);
break;}
}
}
printf("\n\n\n\n\n\n\n");
system("cls");
loop:
{
printf("\n\n\n");
select=menu();
switch(select){
case1:
{
printf("\n请输入要查找的学生学号:
");
scanf("%u",&y.key);
s=search(t,y.key);
if(s==MAX||s<0)printf("notfind\n");
else
{printf("\n\n你要查找的学生信息\n");
printf("学生姓名:
%s\t学生学号:
%u",t[s].name,t[s].key);}
break;}
case2:
{
for(i=0;i{if(t[i].key!
=0)
{
r[j++]=t[i];
m++;
}
}
printf("排序之前:
\n\n");
for(i=0;iprintf("学生姓名:
%s\t学生学号:
%u\t学生成绩:
%d\n",r[i].name,r[i].key,r[i].result);
printf("\n排序之后:
\n");
sort(r,m);
break;
}
case0:
exit(0);
}
getchar();
gotoloop;
}
}
三、实验结果和数据处理
(1)查找数据(310900****)
(2)排序
四、总结
这次的课程实验完成了主控界面,录入,输出,排序,查找,结束界面等功能。
在程序调试过程之中,我还是个初学者,在编写程序的过程中不断出现不同状况的错误,在修改中不断发现自己的问题和不足。
通过编译调试,程序提示错误所在,然后我们根据提示再进行修改。
从这个过程之中,使我多多思考问题,不断摸索,尽量自己发现错误所在并加以改正,以便在下次不再犯同类型的错误。
也就是说在调试的过程中,不断的学习,不断的改进,提高自身C语言学习能力和算法设计能力。
五、问题与讨论
1、分析你所构造散列表的查找成功的平均查找长度?
0
1
2
3
4
5
6
7
8
9
10
…33
…34
…35
…36
…37
…38
…39
…40
…41
…32
1
1
1
1
1
1
1
1
1
1
查找成功的平均查找长度:
(1+1+1+1+1+1+1+1+1+1)/10=1
2、堆排序属于什么类型的排序?
它适合于什么要求的排序,其空间按复杂度和时间复杂度如何?
答:
堆排序属于树形选择排序方法,它适合于排序较大文件的排序方法,是不稳定的。
空间复杂度为O
(1),时间复杂度为O(nlog2n).