查找、排序的应用
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
查找、排序的应用
一、问题描述
对学生的基本信息进行管理。
设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。要求实现以下功能:
1.总成绩要求自动计算;
2.查询:分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);
排序:分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。
二、问题分析
1.定义储存学生信息的储存结构
2.对学生信息进行查询和排序。
3.查询用到两种查询方式:折半查找和顺序查找.
4.排序用到两种方式:插入排序和选择排序。
三、算法设计
(1)定义学生信息存储结构
typedef struct//定义每个记录(数据元素)的结构
{
string name;//姓名
string sex;//性别
int number;//学号
float grade1,grade2;//成绩1,成绩2
float score;//总分
}RecordType,RT[MAXSIZE];
(2)查找方法
a、折半查找
设表长为n,low、high和mid分别指向待查元素所在区间的下界、上界和中点,key为给定值。初始时,令
low=1,high=n,mid= (low+high)/2,让key与mid指向的记录比较,
若key==r[mid].key,查找成功
若key 若key>r[mid].key,则low=mid+1 重复上述操作,直至low>high时,查找失败 b、顺序查找 从表的一端开始逐个进行记录的关键字和给定值的比较。在这里从表尾开始并把下标为0的作为哨兵。 (3)排序 a、插入排序 每步将一个待排序的记录,按其关键码大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。 b、选择排序 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换 重复上述操作,共进行n-1趟排序后,排序结束。 四、测试数据 五、源代码 ----------------------------------------Find sort.h------------------------------------------- #include using namespace std; #define MAXSIZE 100 typedef struct//定义每个记录(数据元素)的结构 { string name;//姓名 string sex;//性别 int number;//学号 float grade1,grade2;//成绩1,成绩2 float score;//总分 }RecordType,RT[MAXSIZE]; class student { private: RT rt; int total;//学生总数 public: void GreatRT(int);//构建信息库 void BinarySearch();//折半查找 void SequentialSearch();//顺序查找 void Insertsort();//插入排序 void SelectSort();//选择排序 }; --------------------------------------Find sort.cpp------------------------------------------ #include #include"Find sort.h" using namespace std; void student::GreatRT(int n) {//信息构建 total=n; int i=1; do{ cout<<"请输入第"< cout<<"姓名:"; cin>>rt[i].name; cout<<"性别:"; cin>>rt[i].sex; cout<<"学号:"; cin>>rt[i].number; cout<<"成绩1:"; cin>>rt[i].grade1; cout<<"成绩2:"; cin>>rt[i].grade2; rt[i].score=rt[i].grade1+rt[i].grade2; i++; cout< }while(i<=total); cout<<"输入完毕!"< } void student::BinarySearch() {//折半查找算法: RecordType LI; for(int i=2;i<=total;i++){//使学号变为有序 for(int j=i;j>1;j--){ if(rt[j].number