数据结构 查找排序实验

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

排序后:
直接选择法对C++成绩进行排序: 排序前:
排序后:
二分法队学生的成绩进行查找:
冒泡法对学生的数据结构成绩进行排序: 排序前:
排Hale Waihona Puke Baidu后:
四、实验总结 1、关键码是数据元素中某个数据项的值,它可以标识一个数据元 素,能唯一确定一个数据元素的关键码为主关键码,不能唯一确定一个 数据元素的关键码为次关键码。 2、此实验所用的是静态查找表,静态查找表仅对查找表进行查找操 作,而不能改变查找表。 3、折半查找也称为二分查找,但是它要求查找表必须是顺序表,且 表中的数据元素按关键码有序排列。 4、排序方法的好坏取决于两个因素:一算法执行所需要的时间,而 执行所需要的辅助存储空间。算法的时间主要由纪录的比较次数和移动 次数来决定。 5、直接排序,折半排序,冒泡排序和选择排序都需要一个辅助存储 单元。
SNode s; Init(&s); int i; int a[8]={1,2,3,4,5,6,7,8}; string b[8]={"王立","张秋","刘丽","王通","赵阳","李艳","钱娜","孙 胜"}; int c[8]={03511,03511,03511,03511,03511,03511,03511,03511}; int d[8]={85,78,90,75,60,58,95,45}; int e[8]={76,88,79,86,71,68,89,60}; Create(&s,a,b,c,d,e,8); string names; int score; cout<<"请输入您要查找的学生的姓名:"; cin>>names; N_Search(&s,names); cout<<"请输入您要查找的学生的姓名:"; cin>>names; N_Search(&s,names); cout<<"--------姓名排序--------"<<endl; cout<<"********排序前的输出结果:********"<<endl; for(i=1;i<9;i++) Display(&s,i); N_Sort(&s,8); cout<<"********排序后的输出结果:********"<<endl; for(i=1;i<9;i++) Display(&s,i); cout<<"------C++成绩排序--------"<<endl; cout<<"********排序前的输出结果:********"<<endl; for(i=1;i<9;i++) Display(&s,i); C_Sort(&s,8); cout<<"********排序后的输出结果:********"<<endl; for(i=1;i<9;i++) Display(&s,i); cout<<"---------二分查找法对C++成绩的查找----------"<<endl; cout<<"请输入您要查找的学生的C++成绩:"; cin>>score; C_Search(&s,score); cout<<"请输入您要查找的学生的C++成绩:"; cin>>score; C_Search(&s,score); cout<<"-------数据结构排序-------"<<endl;
cout<<"********排序前的输出结果:********"<<endl; for(i=1;i<9;i++) Display(&s,i); cout<<"********排序后的输出结果:********"<<endl; S_Sort(&s,8); for(i=1;i<9;i++) Display(&s,i); } 试验结果: 直接插入法按姓名对学生的信息排序: 排序前:
void C_Sort(SNode *t,int n) { int i,j,k; for(i=1;i<n;i++) { for(k=i,j=i+1;j<=n;j++) if(t->data[j].cs<t->data[k].cs) k=j; if(i!=k) { t->data[0]=t->data[k]; t->data[k]=t->data[i]; t->data[i]=t->data[0]; } } } void S_Sort(SNode *t,int n) //冒泡法对数据结构排序 { int i,j; int swap; for(i=1;i<n;i++) { swap=0; for(j=1;j<=n-i;j++) if(t->data[j].ss>t->data[j+1].ss) { t->data[0]=t->data[j]; t->data[j]=t->data[j+1]; t->data[j+1]=t->data[0]; swap=1; } if(swap==0) break; } } int main() {
if(cs1>t->data[mid].cs) low=mid+1; else { flag=mid; break; } } } if(flag==0) cout<<"没有该成绩的学生!"<<endl; else { cout<<"---------该学生的信息:-----------"<<endl; Display(t,flag); } } void N_Sort(SNode *t,int n) //直接插入法对学生的姓名进行排 序 { int i; int j; DataType p; for(i=2;i<=n;i++) { if(t->data[i].name<t->data[i-1].name) { t->data[0].name=t->data[i].name; for(j=i-1;t->data[0].name<t->data[j].name;j--) { p=t->data[j]; t->data[j]=t->data[j+1]; t->data[j+1]=p; } } } }
n)
#include <string> #include <iomanip> using namespace std; const int MAX=100; typedef struct { int num; string name; int classnum; int cs; int ss; }DataType; typedef struct { DataType data[MAX]; int length; }SNode; void Init(SNode *t) { t->length=0; } void Create(SNode *t,int a[],string b[],int c[],int d[],int e[],int //创建 { for(int i=0;i<n;i++) { t->data[i+1].num=a[i]; t->data[i+1].name=b[i]; t->data[i+1].classnum=c[i]; t->data[i+1].cs=d[i]; t->data[i+1].ss=e[i]; t->length++; } } void Display(SNode *t,int i) //输出学生的相关信息 { cout.setf(ios::right);
实验五:查找和排序
班级 B09513 学号 200940 姓名 一、实验目的 1 掌握查找的不同方法,并能用高级语言实现查找算法。 2 熟练掌握顺序表和有序表的顺序查找和二分查找方法。 3 掌握排序的不同方法,并能用高级语言实现排序算法。 4 熟练掌握顺序表的选择排序、冒泡排序和直接插入排序算法的实 现。 二、实验内容 1 创建给定的静态查找表。表中共包含十条学生信息,信息如下: 学号 姓名 班级 C++ 数据结构 1 王立 03511 85 76 2 张秋 03511 78 88 3 刘丽 03511 90 79 4 王通 03511 75 86 5 赵阳 03511 60 71 6 李艳 03511 58 68 7 钱娜 03511 95 89 8 孙胜 03511 45 60 2 使用顺序查找方法,从查找表中查找姓名为赵阳和王夏的学生。 如果查找成功,则显示该生的相关信息;如果查找不成功,则给出相应 的提示信息。 3 使用直接插入排序方法,按姓名对学生信息进行排序。输出排序 前和排序后的学生信息表,验证排序结果。 4 使用直接选择排序方法,对学生信息中的C成绩进行排序。输出排 序前和排序后的学生信息表,验证排序结果。 5使用二分查找方法,从查找表中查找C成绩为79和80的学生。如果 查找成功,则显示该生的相关信息;如果查找不成功,则给出相应的提 示信息。 6 使用冒泡排序方法,对学生信息中的数据结构成绩进行排序。输 出排序前和排序后的学生信息表,验证排序结果。 7 编写一个主函数,将上面函数连在一起,构成一个完整程序。 8 将实验源程序调试并运行。 注意:每完成一个操作必须进行输出,以验证操作的正确性。 三、实验结果 #include <iostream>
cout<<setw(8)<<"学号"<<setw(10)<<"姓名"<<setw(10)<<"班级 " <<setw(10)<<"C++成绩"<<setw(15)<<"数据结构成绩"<<endl; cout.setf(ios::right); cout<<setw(8)<<t->data[i].num<<setw(10)<<t>data[i].name<<setw(10)<<t->data[i].classnum<<setw(10)<<t>data[i].cs<<setw(15)<<t->data[i].ss<<endl; } void N_Search(SNode *t,string kn) //按姓名查找 { int i; i=t->length; t->data[0].name=kn; while(t->data[i].name!=kn) i--; if(i==0) cout<<"······对不起,没有该姓名的学生!········"<<endl; else { cout<<"····找到了 !······"<<endl; Display(t, i); } } void C_Search(SNode *t,int cs1) //二分查找C成绩 { int i=1; int flag,flag1; int low,high,mid,low1,high1,mid1; low=1;low1=1; high=t->length;high1=t->length; flag1=0; flag=0; while(low<=high) { mid=(low+high)/2; if(cs1<t->data[mid].cs) high=mid-1; else {
相关文档
最新文档