查找排序的应用实验报告.docx
《查找排序的应用实验报告.docx》由会员分享,可在线阅读,更多相关《查找排序的应用实验报告.docx(17页珍藏版)》请在冰豆网上搜索。
![查找排序的应用实验报告.docx](https://file1.bdocx.com/fileroot1/2023-1/30/77a0dab3-2015-4c9a-a0bf-609cd89555be/77a0dab3-2015-4c9a-a0bf-609cd89555be1.gif)
查找排序的应用实验报告
实验七查找、排序的应用
实验目的
1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。
2、学会比较各种排序与查找算法的优劣。
3、学会针对所给问题选用最适合的算法。
4、掌握利用常用的排序与选择算法的思想来解决一般问题的方
法和技巧。
二、实验内容
[问题描述]对学生的基本信息进行管理。
[基本要求]
设计一个学生信息管理系统,学生对象至少要包含:
学号、姓名、性别、成绩1、成绩2、总成绩等信息。
要求实现以下功能:
1.总成绩要求自动计算;2.查询:
分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);3.排序:
分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。
[测试数据]
由学生依据软件工程的测试技术自己确定。
三、实验前的准备工作
1、掌握哈希表的定义,哈希函数的构造方法。
2、掌握一些常用的查找方法。
1、掌握几种常用的排序方法。
2、掌握直接排序方法。
四、实验报告要求
1、实验报告要按照实验报告格式规范书写。
2、实验上要写出多批测试数据的运行结果。
3、结合运行结果,对程序进行分析。
五、算法设计
a、折半查找
设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,key为给定值。
初始时,令low=1,high=n,mid=
key与mid指向的记录比较,
若key==r[mid].key
若key若key>r[mid].key
重复上述操作,直至
(low+high)/2,让
b、顺序查找
,查找成功
,贝Uhigh=mid-1
,贝Ulow=mid+1low>high时,查找失败
从表的一端开始逐个进行记录的关键字和给定值的比较。
并把下标为0的作为哨兵。
voidchaxun(SqList&ST)//查询信息
{cout<<"\n************************"<在这里从表尾开始
cout<<"~
(1)
根据学号查询
~"<cout<<"~
⑵
根据姓名查询
~"<cout<<"~
⑶
根据性别查询
~"<cout<<"~
⑷
退出
'<cout<<"************************"<if(m==1)
折半查找算法:
for(inti=1;ivST.Iength;i++)//for(intj=i;j>=1;j--)if(ST.r[j].xuehaoLI=ST.r[j];
ST.r[j]=ST.r[j-1];
ST.r[j-1]=LI;
使学号变为有序
}
inta=0;
coutvv"输入要查找的学号"<>n;
intlow,high,mid;
low=0;high=ST.Iength-1;//while(low<=high)
{mid=(low+high)/2;
if(n==ST.r[mid].xuehao){
cout<break;
}
elseif(nvST.r[mid].xuehao)high=mid-1;//else
low=mid+1;//
置区间初值
继续在前半区间进行查找
继续在后半区间进行查找
顺序查找算法:
coutvv"输入要查找的姓名"<>name;
for(inti=0;ivST.length;i++)
{
if(name==ST.r[i].xingming)
{
coutvvST.r[i].xuehaovv""vvST.r[i].xingmingvv""vvST.r[i].xingbeivv""vvST.r[i].chengjilvv"
"<"<}
1、插入排序
每步将一个待排序的记录,按其关键码大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。
//按学号排序,使用插入排序
RecordTypeLI;//定义存储学号向量
for(inti=1;ifor(intj=i;j>=1;j--)
if(ST.r[j].xuehao{
LI=ST.r[j];
ST.r[j]=ST.r[j-1];
ST.r[j-1]=LI;}
2、选择排序
首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换
再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换
重复上述操作,共进行n-1趟排序后,排序结束。
//按成绩1排序,用选择排序
RecordTypeLI;
for(inti=0;ivST.Iength;i++)for(intj=i+1;jvST.Iength;j++){if(ST.r[i].chengji1>ST.r[j].chengji1)
{LI=ST.r[j];ST.r[j]=ST.r[i];ST.r[i]=LI;
六、运行测试结果
输入学生信息
输3拖于1姓許性男成篇-g;
入号名d别
睪甜拮息如下学号姓名
1
2
3
请选择要迸人的模块◎〉查询
<3>dStrj
sed
«ue
noc
性别
―I
成绩1
99
99
9Q
成绩2
99
9G
95
总分
198
18E
18E
以多种方式进行查找
ITS
1S5
111
氓据学号查询
艮g姓4查询
<3>®i性钢查询
2
输入要查找的姓名
sed
1sed
19B
ipl
<2>Wi姓杳查询
<3>><4>i1输入要查找的学号1
1zed男9999
198
*1斗厂17y"■/I-J
⑶a据成绩胡甘
肇生
2
3
h序完毕
的蜜下
eue
noc
zed
性别
咸绩1
B9
9Q
99
成绩玄
95
9号
总分
185
1S5
198
六、实验总结
定得了解,知道了
通过本次实验我对查找排序的应用有了各种查找排序的基本知识。
同时,通过自己数次的调试、修改也
搞懂了许多以前比较模糊的知识点,比如这次的界面是复制过来的,其中很多语句经过同学的讲解都理解了。
但这次实验也有很多不尽人意的地方,我将在以后多学习同学优秀的地方.也会在以后的学习过程中要尽量考虑周全,使程序更有实用价值,提高编程能力。
七、源代码
#inelude
usingnamespacestd;
#include
#defineMAXSIZE100//设记录不超过20个
定义每个记录
typedefstruct//
{
stringxingming;
stringxingbei;
floatxuehao;
(数据元素)的结构
//
//
//
//
姓名
性别
学号
成绩1成绩2
总分
floatchengji1,chengji2;
floatzong;
}RecordType;
typedefstruct//
{
RecordTyper[MAXSIZE+1];//
intlength;//顺序表的长度
}SqList;
voidcaidan(SqList&ST);
voidCreatList(SqList&ST)//
{
cout<<"输入学生个数"<cin>>ST.Iength;
for(inti=0;i{
cout<<"输入第"<
cin>>ST.r[i].xuehao;
cout<<"姓名"<cin>>ST.r[i].xingming;
cout<<"性别"<cin>>ST.r[i].xingbei;
cout<<"成绩1"<cin>>ST.r[i].chengji1;
cout<<"成绩2"<cin>>ST.r[i].chengji2;
//
定义顺序表的结构
存储顺序表的向量
创建学生的相关信息
}cout<<"输入完毕"<}
voidzong(SqList&ST)//
{
计算总分
for(inti=0;i{
ST.r[i].zong=ST.r[i].chengji1+ST.r[i].chengji2;
}
voidshuchu(SqList&ST)//
{
cout<<"学生的信息如下cout<<"学号姓名for(inti=0;icout<"<"<}
}
voidchaxun(SqList&ST)//
{
11:
cout<输出
"<性别成绩
查询信息
cout<<"
(1)
根据学号查询"<cout<<"
(2)
根据姓名查询"<cout<<"(3)
根据性别查询"<cout<<"(4)
退出"<intn,m;
stringname;
stringxb;
cin>>m;
if(m==1)
//
{
RecordTypeLI;//
for(inti=1;i=1;j--)
成绩2总分"<"<"<折半查找
使学号变为有序
if(ST.r[j].xuehao{
LI=ST.r[j];
ST.r[j]=ST.r[j-1];
ST.r[j-1]=LI;
}
12:
inta=0;
cout<<"输入要查找的学号"<>n;
intlow,high,mid;low=0;high=ST.length-1;//while(low<=high)
{
mid=(low+high)/2;
if(n==ST.r[mid].xuehao)
{
cout<"<a=1;break;
}
elseif(n}
if(!
a)
{
cout<<"
置区间初值
"<"<继续在前半区间进行查找
继续在后半区间进行查找
cout<<"gotol2;
}
gotol1;
}
if(m==2)
{
所查信息不存在!
"<//
顺序查找
l3:
inta=0;
cout<<"输入要查找的姓名"<>name;
for(inti=0;i{
if(name==ST.r[i].xingming)
{
cout<"<"<}
}
if(!
a)
"<"<cout<<"
cout<<"goto13;
所查信息不存在!
"<goto11;
}
if(m==3)
{
14:
inta=0;
cout<<"输入要查找性别"<cin>>xb;
for(inti=0;i{
if(xb==ST.r[i].xingbei)
{
cout<"<"<a=1;
}
}
if(!
a)
//
顺序查找
"<"<
{
cout<<"所查信息不存在!
"<cout<<"请重新输入"<gotol4;
}
gotol1;
}if(m==4)
{
caidan(ST);
}
排序
}
voidpaixu(SqList&ST)//
{
l1:
intn;
根据学号排序"<cout<cout<<"
(1)
cout<<"
(2)
for(inti=1;ifor(intj=i;j>=1;j--)if(ST.r[j].xuehaoLI=ST.r[j];
ST.r[j]=ST.r[j-1];
ST.r[j-1]=LI;
}shuchu(ST);
cout<<"排序完毕"<}
if(n==2)
{
RecordTypeLI;
for(inti=0;ifor(intj=i+1;jif(ST.r[i].chengji1>ST.r[j].chengji1){
LI=ST.r[j];
ST.r[j]=ST.r[i];
ST.r[i]=LI;
}
}
shuchu(ST);
cout<<"排序完毕"<根据成绩2排序,使用选择法排序
}
if(n==3)//
{
RecordTypeLI;
for(inti=0;ifor(intj=i+1;jif(ST.r[i].chengji2>ST.r[j].chengji2){
LI=ST.r[j];ST.r[j]=ST.r[i];ST.r[i]=LI;
}
}
shuchu(ST);
cout<<"排序完毕"<gotol1;
}
if(n==4)//根据总成绩排序,使用选择法排序
{
RecordTypeLI;
for(inti=0;ifor(intj=i+1;j{
if(ST.r[i].zong>ST.r[j].zong)
{
LI=ST.r[j];
ST.r[j]=ST.r[i];
ST.r[i]=LI;
}
}
shuchu(ST);
cout<<"排序完毕"<退出
}
if(n==5)//
{
caidan(ST);
}
选择菜单
}
voidcaidan(SqList&ST)//
{
cout<<"请选择要进入的模块"<(1)查询"<cout<<"
(2)排序"<cout<<"(3)退出"<intc;
cin>>c;
if(c==1)
{
chaxun(ST);
}if(c==2)
{
paixu(ST);
}if(c==3)
{exit(0);
}
}voidmain()
{
SqListST;CreatList(ST);zong(ST);shuchu(ST);caidan(ST);