实验六、七:查找、排序算法的应用班级 10511 学号 20103051114 姓名高卫娜一、实验目的1 掌握查找的不同方法,并能用高级语言实现查找算法。
2 熟练掌握顺序表和有序表的顺序查找和二分查找方法。
3 掌握排序的不同方法,并能用高级语言实现排序算法。
4 熟练掌握顺序表的选择排序、冒泡排序和直接插入排序算法的实现。
二、实验内容1 创建给定的顺序表。
表中共包含八条学生信息,信息如下:学号姓名班级C++ 数据结构1 王立03511 85 762 张秋03511 78 883 刘丽03511 90 794 王通03511 75 865 赵阳03511 60 716 李艳03511 58 687 钱娜03511 95 898 孙胜03511 45 602 使用顺序查找方法,从查找表中查找姓名为赵阳和王夏的学生。
如果查找成功,则显示该生的相关信息;如果查找不成功,则给出相应的提示信息。
3 使用二分查找方法,从查找表中查找学号为7和12的学生。
如果查找成功,则显示该生的相关信息;如果查找不成功,则给出相应的提示信息。
(注意:创建静态查找表时必须按学号的从小到大排列!)4 使用直接插入排序方法,对学生信息中的姓名进行排序。
输出排序前和排序后的学生信息表,验证排序结果。
5 使用直接选择排序方法,对学生信息中的C成绩进行排序。
输出排序前和排序后的学生信息表,验证排序结果。
6 使用冒泡排序方法,对学生信息中的数据结构成绩进行排序。
输出排序前和排序后的学生信息表,验证排序结果。
7 编写一个主函数,将上面函数连在一起,构成一个完整程序。
8 将实验源程序调试并运行。
三、实验结果源程序代码为:#include<iostream.h>#include<string.h>#include <stdlib.h>#define MAXSIZE 10typedef char KeyType1;typedef int KeyType2;typedef struct{//学号姓名班级C++ 数据结构KeyType1 name[20];KeyType2 xuehao;KeyType1 Class[20];double score[2];} DataType;typedef struct{DataType data[MAXSIZE+1];int len;} SeqList;//顺序表的创建void create(SeqList &L){cout<<"请输入顺序表的大小:"<<endl;cin>>L.len;cout<<"请输入顺序表中八条学生信息(学号姓名班级C++ 数据结构):"<<endl;for(int i=1;i<=L.len;i++){cin>>L.data[i].xuehao;cin>>L.data[i].name;cin>>L.data[i].Class;cin>>L.data[i].score[0];cin>>L.data[i].score[1];}}void Input(SeqList &L){for(int i=1;i<=L.len;i++){cin>>L.data[i].xuehao;cin>>L.data[i].name;cin>>L.data[i].Class;cin>>L.data[i].score[0];cin>>L.data[i].score[1];}}//顺序表的显示void print(SeqList L){cout<<"学号姓名班级C++ 数据结构"<<endl;if(L.len==0){cout<<"该表是空表!"<<endl;return;}for(int i=1;i<=L.len;i++){cout<<" "<<L.data[i].xuehao<<" "<<L.data[i].name<<" "<<L.data[i].Class<<" "<<L.data[i].score[0]<<" "<<L.data[i].score[1];cout<<endl;}}//顺序查找方法从查找表中查找姓名为赵阳和王夏的学生void S_Search(SeqList L){char na[20];cout<<"请输入要查找的同学的姓名:"<<endl;cin>>na;strcpy(L.data[0].name,na); //监视哨int i=L.len;while(strcmp(L.data[i].name,na)>0||strcmp(L.data[i].name,na)<0)i--;if(i>0){cout<<"您要查找的学生的信息:"<<endl; cout<<"学号姓名班级C++ 数据结构"<<endl;cout<<" "<<L.data[i].xuehao<<" "<<L.data[i].name<<" "<<L.data[i].Class<<" "<<L.data[i].score[0]<<" "<<L.data[i].score[1];cout<<endl;}if(i<=0){cout<<"对不起,没有该同学的信息!"<<endl;}}//二分查找方法从查找表中查找学号为7和12的学生//非递归void Binary_Search(SeqList &L){int kx;cout<<"请输入您要查找的学生信息的学号:"<<endl;cin>>kx;int low=1,high=L.len,mid;while(low<=high){mid=(low+high)/2;if(L.data[mid].xuehao==kx){cout<<"您要查找的学生的信息:"<<endl; cout<<"学号姓名班级C++ 数据结构"<<endl;cout<<" "<<L.data[mid].xuehao<<" "<<L.data[mid].name<<" "<<L.data[mid].Class<<" "<<L.data[mid].score[0]<<" "<<L.data[mid].score[1];cout<<endl;break;}else if(L.data[mid].xuehao>kx)high=mid-1;elselow=mid+1;}if(low>high){cout<<"没有该学号的学生信息!"<<endl;}}//直接插入排序方法对顺序表直接插入排序的算法对学生信息中的姓名进行排序:void InsertSort( SeqList &L ){int i, j;for( i=2; i<=L.len; i++ )if(strcmp(L.data[i].name, L.data[i-1].name)<0){L.data[0]=L.data[i]; // 复制为哨兵for(j=i-1; strcmp(L.data[0].name, L.data[j].name)<0; j-- )L.data[j+1]=L.data[j]; // 记录后移L.data[j+1]=L.data[0]; // 插入到正确位置}print(L);}//直接选择排序方法对学生信息中的C成绩进行排序void SelectSort(SeqList &L){int i, j,k;DataType temp;for( i=1; i<L.len; i++ ){k = i;for( j=i+1; j<=L.len; j++ )if( L.data[j].score[0] < L.data[k].score[0] )k = j ;if( k != i ){temp = L.data[i];L.data[i] = L.data[k];L.data[k] =temp;}}print(L);}//冒泡排序方法对学生信息中的数据结构成绩进行排序void BubbleSort(SeqList &L){int i,j,flag=1;DataType x;for(i=1;((i<L.len)&&(flag==1));i++){flag=0;for(j=1;j<L.len-i+1;j++)if(L.data[j].score[1]>L.data[j+1].score[1]){x=L.data[j];L.data[j]=L.data[j+1];L.data[j+1]=x;flag=1;}}print(L);}void main(){SeqList L;int a;cout<<endl;while(a!=0){cout<<endl;cout<<"-------------------------欢迎使用学生信息系统----------------------------\n"<<endl;cout<<endl;cout<<" 1 :录入学生信息 2 :按姓名查找学生信息3:按学号查找学生信息"<<endl;cout<<endl;cout<<" 4 :按姓名排序后学生信息5 :按c成绩排序学生信息"<<endl;cout<<endl;cout<<" 6 :按数据结构成绩排序后学生信息7 :显示0 :退出"<<endl;cout<<endl;cout<<"--------------------------------------------------------------------------"<<endl;cout<<endl;cout<<"输入您的选择为:";cin>>a;switch(a){case 1:{ create(L); break; }case 2: //顺序查找方法从查找表中查找姓名为赵阳和王夏的学生{ S_Search(L); break; }case 3:{ Binary_Search(L); break; }case 4:{cout<<"对学生信息中的姓名进行排序为:"<<endl;InsertSort(L);break;}case 5:{cout<<"对学生信息中的C成绩进行从低到高排序为:"<<endl;SelectSort(L);break;}case 6:{cout<<"对学生信息中的数据结构成绩进行从低到高排序为:"<<endl;BubbleSort(L);break;}case 7:{ print(L); break; }case 0: exit(0);default:{cout<<"您输入的序号不正确,请重新输入:"<<endl;break;}}}}建立顺序表的运行结果为图1-1:图1-1录入学生信息查找的运行结果如图1-2,图1-3:图1-2按姓名查找图1-3按学号查询排序的运行结果如下图1-4,图1-5,图1-6:图1-4按姓名排序图1-5按c成绩排序图1-6按数据结构成绩排序结束结果如图1-7:图1-7推出程序四、实验总结(1)exit(0)需要头文件#include<stdlib.h>退出程序;(2)比较字符串使用头文件#<string.h>中得strcmp();复制字符串使用strcpy();(3)从表的一端开始,向另一端逐个将给定值x与关键码进行比较;使用折半查找的前提:查找表必须是有序表;在有序表中,取中间元素作为比较对象(4)直接插入排序是一种稳定的排序方法。