实验五:查找和排序
一、实验目的
1 掌握查找的不同方法,并能用高级语言实现查找算法。
2 熟练掌握顺序表和有序表的顺序查找和二分查找方法。
3 掌握排序的不同方法,并能用高级语言实现排序算法。
4 熟练掌握顺序表的选择排序、冒泡排序和直接插入排序算法的实现。
二、实验内容
1 创建给定的静态查找表。表中共包含十条学生信息,信息如下:
学号 姓名
1
王立
2
张秋
3
刘丽
4
王通
5
赵阳
6
李艳
7
钱娜
8
孙胜
班级
03511
03511
03511
03511
03511
03511
03511
03511
C++
85
78
90
75
60
58
95
45
数据结构
76
88
79
86
71
68
89
60
2 使用顺序查找方法,从查找表中查找姓名为赵阳和王夏的学生。如果查找成
功,则显示该生的相关信息;如果查找不成功,则给出相应的提示信息。
3 使用直接插入排序方法,按姓名对学生信息进行排序。输出排序前和排序后
的学生信息表,验证排序结果。
4 使用直接选择排序方法,对学生信息中的 C 成绩进行排序。输出排序前和
排序后的学生信息表,验证排序结果。
5 使用二分查找方法,从查找表中查找 C 成绩为 79 和 80 的学生。如果查找成
功,则显示该生的相关信息;如果查找不成功,则给出相应的提示信息。
6 使用冒泡排序方法,对学生信息中的数据结构成绩进行排序。输出排序前和
排序后的学生信息表,验证排序结果。
7 编写一个主函数,将上面函数连在一起,构成一个完整程序。
8 将实验源程序调试并运行。
注意:每完成一个操作必须进行输出,以验证操作的正确性。
三、实验结果
源文件:
1.Search
#define MAXSIZE 10
#include
using namespace std;
typedef struct{
string name;
int number;
long Class;
int C_score;
int Data_score;
}DataType;
typedef struct {
DataType *stu;
int length;
i,int number,string name,long Class,int C_score,int
}Student;
void S_Init(Student *t,int
Data_score);
int S_Search(Student *t,string name);
void D_insertsort(DataType *);//直接 按姓名
void select_sort(Datatype *);//直接 按 C 成绩
int Binary_Search(Student *t,int C_score);// 二分 按 C
void Bubble_sort(Student *t); //冒泡
void print(Student *t);
2.Search.cpp
#include"search.h"
#include
#include
using namespace std;
void S_Init(Student *t,int
Data_score)
{
i,int number,string name,long Class,int C_score,int
t->stu[i].name=name;
t->stu[i].number=number;
t->stu[i].Class=Class;
t->stu[i].C_score=C_score;
t->stu[i].Data_score=Data_score;
t->length++;
}
void S_Search(Student *t,string name)
{
int i;
t->stu[0].name=name;
for(i=t->length;i>0||t->stu[0].name!=name;i--);
if(i>0)
{
cout<<"查无此人"<stu[i].name<<'\t'<stu[i].number<<'\t'<stu[i].Class<<'\t'<stu[i]
.C_score<<'\t'<stu[i].Data_score;
}
void print(Student *s)
{
int i;
cout<<" 学 号 "<<'\t'<<" 姓 名 "<<'\t'<<" 班 级 "<<'\t'<<"C++"<<'\t'<<" 数 据 结 构
"<length;i++)
cout<stu[i].name<<'\t'<stu[i].number<<'\t'<stu[i].Class<<'\t'<stu[i]
.C_score<<'\t'<stu[i].Data_score;
}
void D_insertsort(Student *t)//直接 按姓名
{
int i,j;
for(i=2;i<=MAX;i++)
if(t->stu[i].namestu[i-1].name){
t->stu[0]=t->stu[i];
for(j=i-1;t->stu[0].namestu[j].name;j--)
t->stu[j+1]=t->stu[j];
t->stu[j+1]=t->stu[0];
}
}
void select_sort(Student *t)//直接 按 C 成绩
{
cout<<"直接选择排序按 C 成绩:"<stu[j]score1stu[k].score1)
k=j;
if(i!=k){
t->stu[0]=t->stu[k];
t->stu[k]=t->stu[i];
t->stu[i]=t->stu[0];
}
}
}
Binary_Search(Student *t,int score)// 二分 按 C
{
int low,high,mid;
int flag;
low=1;
high=t->length;
flag=0;
while(low<=high)
{
mid=(low+high)/2;
if(score
stu[mid].C_score)
high=mid-1;
else
if(score>stu[mid].C_score)
low=mid+1;
else{
flag=mid;
break;
}
}
if(flag==score)
{
cout<<"学号"<<'\t'<<"姓名"<<'\t'<<"班级"<<'\t'<<"C++"<<'\t'<<"数据结构
"<stu[mid].name<<'\t'<stu[mid].number<<'\t'<stu[mid].Class<<'\t'<
stu[mid].C_score<<'\t'<stu[mid].Data_score;
}
else
cout<<"查无此人"<}
void Bubble_sort(Student *t) //冒泡
{
cout<<"冒泡排序数据结构成绩:"<
stu[j].score2>t->stu[j+1].score2){
t->stu[0]=t->stu[j];
t->stu[j]=t->stu[j+1];
t->stu[j+1]=t->stu[0];
swap=1;
}
if(swap==0)
break;
}
}
3.Test
#include"search.h"
#include
#include
using namespace std;
void main()
{
Student *t;
t=new Student;
t->length=0;
S_Init(t,0,1,"王立",03511,85,76);
S_Init(t,1,2,"张秋",03511,78,88);
S_Init(t,2,3,"刘丽",03511,90,79);
S_Init(t,3,4,"王通",03511,75,86);
S_Init(t,4,5,"赵阳",03511,60,71);
S_Init(t,5,6,"李艳",03511,58,68);
S_Init(t,6,7,"钱娜",03511,95,89);
S_Init(t,7,8,"孙胜",03511,45,60);
cout<<"按姓名顺序查找:"<S_Search(t,"赵阳");
S_Search(t,"王夏");
cout<<"按姓名直接插入排序:"<
按 C 成绩直接选择排序输出结果
按 C 成绩二分查找输出结果
四、实验总结
按数据结构成绩冒泡排序输出结果
需要被反复使用的许多操作,应该组装到一个函数中,方便调用,也可以减少
代码的长度,参数的类型应该注意,否则容易因为不匹配而发生错误。