查找、排序的应用

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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

LI=rt[j];

rt[j]=rt[j-1];

rt[j-1]=LI;

}

}

}

int n,m=0;

cout<<"输入要查找的学号:";

cin>>n;

int low,high,mid;

low=1;high=total;//置区间初值

while (low<=high){

mid=(low+high)/2;

if(n==rt[mid].number){

m=1;

break;

}

else if(n

else low=mid+1;//继续在后半区间进行查找

}

if(m!=0)

cout<

<

<

<

<

<

else cout<<"没有你要查找的学号!"<

}

void student::SequentialSearch()

{//顺序查找算法:

string name;

int m=0;

cout<<"输入要查找的姓名:";

cin>>name;

相关文档
最新文档