实验七八 查找排序应用问题实现.docx
《实验七八 查找排序应用问题实现.docx》由会员分享,可在线阅读,更多相关《实验七八 查找排序应用问题实现.docx(10页珍藏版)》请在冰豆网上搜索。
![实验七八 查找排序应用问题实现.docx](https://file1.bdocx.com/fileroot1/2022-11/16/1caa0b68-0cf9-4e79-8a9c-3348ff1a3197/1caa0b68-0cf9-4e79-8a9c-3348ff1a31971.gif)
实验七八查找排序应用问题实现
实验七、八查找排序应用问题实现
一、实验目的
1.理解掌握动态查找表在计算机中的各种实现方法。
2.熟练掌握顺序查找、折半查找在顺序表上的实现及解决简单的应用问题。
3.熟练掌握常用排序算法在顺序表上的实现,能解决简单的应用问题。
二、实验内容
题目1:
从键盘上输入n个学生的基本信息(学号、姓名、班级、年龄等),建立其顺存储结构,然后执行如下操作:
1、分别按学号、姓名、班级、年龄进行插入排序、交换排序和选择排序并显示排序结果(排序算法任选,但必须保证每种算法至少使用一次);
2、可按学号、姓名、班级或其组合查找某一学生,若查找成功,则输出其基本信息,否则提示出错。
三、实验步骤
㈠、数据结构与核心算法的设计描述
#include
#include
#include
#defineMAXSIZE20
typedefstruct//学生结构体的定义
{
intnum;//学号
charname[10];//姓名
charcla[20];//班级
intage;//年龄
}Student;
typedefstructSqList//顺序表结构体的定义
{
StudentStu[MAXSIZE+1];//定义一个存放学生信息的数组
}SqList;
//直接插入排序(班级优先)
voidInsertsort(SqList&L))
{
inti,j;
for(i=2;i<=n;++i)
if(strcmp(L.Stu[i].cla,L.Stu[i-1].cla)<0)
{
L.Stu[0]=L.Stu[i];
for(j=i-1;strcmp(L.Stu[0].cla,L.Stu[j].cla)<0;--j)
L.Stu[j+1]=L.Stu[j];
L.Stu[j+1]=L.Stu[0];
}
}
//选择排序(姓名优先)
voidSelectsort(SqList&L)
{
Studentt;
inti,j,k;
for(i=1;i<=n;i++)
{
k=i;
for(j=i+1;j<=n;j++)
if(strcmp(L.Stu[j].name,L.Stu[k].name)<0)
k=j;
if(k!
=i)
{
t=L.Stu[i];
L.Stu[i]=L.Stu[k];
L.Stu[k]=t;
}
}
}
//快速排序
voidQuicksort(SqListL,intlow,inthigh)
{
intlocation;
if(low{
location=Partition(L,low,high);
Quicksort(L,low,location-1);//对左区间递归排序
Quicksort(L,location+1,high);//对右区间递归排序
}
}
//查找学生信息
voidfind(SqList&L,intn)
{
intt,m=1;
cout<<"请输入你要查找的学号:
"<cin>>t;
cout<<"该学生的信息为:
"<while(m<=n&&L.Stu[m].num!
=t)
m++;
if(L.Stu[m].num==t)
cout<<"学号是:
"<"<"<"<else
cout<<"没有你要查找的学生!
"<}
㈡、程序调试及运行结果分析
4、实验总结
通过这次实验我理解掌握基本查找算法、排序算法的特点及在计算机中的实现方法。
在实验过程中,我运用所学的知识解决简单的应用问题,通过不断的修改程序来完善自己的不足之处。
只有这样,才能更快的进步。
5、程序清单
#include
#include
#include
#defineMAXSIZE20
intn;
typedefstruct//学生结构体的定义
{
intnum;//学号
charname[10];//姓名
charcla[20];//班级
intage;//年龄
}Student;
typedefstructSqList//顺序表结构体的定义
{
StudentStu[MAXSIZE+1];//定义一个存放学生信息的数组
}SqList;
voidCreatInfo(SqList&L)
{
cout<<"请输入你要创建的学生数:
"<cin>>n;
cout<<"学生的信息:
"<cout<<"姓名学号年龄班级:
"<for(inti=1;i<=n;i++)
{
cin>>L.Stu[i].name>>L.Stu[i].num>>L.Stu[i].age>>L.Stu[i].cla;
}
}
voidprint(SqList&L)//输出顺序表
{
cout<<"输出学生信息:
"<for(inti=1;i<=n;++i)
{
cout<}
}
voidInsertsort(SqList&L)//直接插入排序(班级优先)
{
inti,j;
for(i=2;i<=n;++i)
if(strcmp(L.Stu[i].cla,L.Stu[i-1].cla)<0)
{
L.Stu[0]=L.Stu[i];
for(j=i-1;strcmp(L.Stu[0].cla,L.Stu[j].cla)<0;--j)
L.Stu[j+1]=L.Stu[j];
L.Stu[j+1]=L.Stu[0];
}
}
intPartition(SqList&L,inti,intj)//快速排序
{
Studentp;
L.Stu[0]=L.Stu[i];
p=L.Stu[i];
while(i{
while(i=p.num)
j--;
L.Stu[i]=L.Stu[j];
while(ii++;
L.Stu[j]=L.Stu[i];
}
L.Stu[i]=p;
returni;
}
voidQuicksort(SqListL,intlow,inthigh)//快速排序
{
intlocation;
if(low{
location=Partition(L,low,high);
Quicksort(L,low,location-1);//对左区间递归排序
Quicksort(L,location+1,high);//对右区间递归排序
}
}
voidSelectsort(SqList&L)//选择排序(姓名优先)
{
Studentt;
inti,j,k;
for(i=1;i<=n;i++)
{
k=i;
for(j=i+1;j<=n;j++)
if(strcmp(L.Stu[j].name,L.Stu[k].name)<0)
k=j;
if(k!
=i)
{
t=L.Stu[i];
L.Stu[i]=L.Stu[k];
L.Stu[k]=t;
}
}
}
voidfind(SqList&L,intn)//查找学生信息
{
intt,m=1;
cout<<"请输入你要查找的学号:
"<cin>>t;
cout<<"该学生的信息为:
"<while(m<=n&&L.Stu[m].num!
=t)
m++;
if(L.Stu[m].num==t)
cout<<"学号是:
"<"<"<"<else
cout<<"没有你要查找的学生!
"<}
intmain()
{
SqListL;
intk;
CreatInfo(L);//创建学生信息
print(L);//按输入顺序打印出顺序表
loop:
cout<<"请选择排序方式:
"<cout<<"1插入排序(班级优先)"<cout<<"2选择排序(姓名优先)"<cout<<"3快速排序"<cout<<"4按学号查找学生"<cout<<"0退出排序程序"<cin>>k;
if(k!
=0)
{
switch(k)
{
case1:
Insertsort(L);//进行插入排序
print(L);break;//输出插入排序后的顺序表
case2:
Selectsort(L);//进行选择排序
print(L);break;//输出排序后的顺序表
case3:
Quicksort(L,1,n);//选择快速排序
print(L);break;//输出排序后的顺序表
case4:
find(L,n);break;//查找学生信息
default:
cout<<"输入错误!
"<}
}
cout<gotoloop;
return0;
}