实验七 查找

更新时间:2023-11-13 17:50:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

实验七 查找、排序的应用

一、实验目的

1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。 2、学会比较各种排序与查找算法的优劣。 3、学会针对所给问题选用最适合的算法。

4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。

二、实验内容

[问题描述]

学生信息管理系统 [基本要求]

设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。要求实现以下功能:

1.试选择一种方式实现:基于数组、链表或文件方式 2.总成绩要求自动计算;

3.查询:分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现);

排序:分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。 [测试数据]

由学生依据软件工程的测试技术自己确定。

三、实验前的准备工作

1、掌握哈希表的定义,哈希函数的构造方法。 2、掌握一些常用的查找方法。 1、掌握几种常用的排序方法。 2、掌握直接排序方法。

四、实验报告要求

1、实验报告要按照实验报告格式规范书写。 2、实验上要写出多批测试数据的运行结果。

3、结合运行结果,对程序进行分析。

三、实验步骤

typedef struct

//定义每个记录(数据元素)的结构 {

string xingming; //姓名 string xingbei; //性别 float xuehao; //学号

float chengji1,chengji2; //成绩1,成绩2 float zong; //总分 }RecordType;

typedef struct //定义顺序表的结构 {

RecordType r[MAXSIZE +1]; //存储顺序表的向量

查找

顺序查找

从表的一端开始逐个进行记录的关键字和给定值的比较。在这里从表尾开始并把下标为0的作为哨兵。

void chaxun(SqList &ST) //查询信息 {

cout<<\ cout<<\根据学号查询 ~\ cout<<\根据姓名查询 ~\ cout<<\根据性别查询 ~\ cout<<\退出 ~\

cout<<\顺序查找算法:

cout<<\输入要查找的姓名\ cin>>name;

for(int i=0;i

if(name==ST.r[i].xingming) {

cout<

排序

a.直接插入排序

每步将一个待排序的记录,按其关键码大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。

//按学号排序,使用插入排序 void inssort(recordlist * l) {

int j;

for(int i=2;i<=l->length;i++) {

l->r[0].key=l->r[i].key; j=i-1;

while(l->r[0].keyr[j].key) {

l->r[j+1].key =l->r[j].key; j=j-1; }

l->r[j+1].key=l->r[0].key; }

for(int m=1;m<=l->length;m++) cout<r[m].key<<\cout<

b.冒泡排序

void bubblesort(recordlist * l) {

int i,j,x;

int change=TRUE;

for(i=1;i<=l->length && change;++i) {

change=FALSE;

for(j=1;j<=l->length-i;++j)

if(l->r[j].key>l->r[j+1].key) {

x=l->r[j].key;

l->r[j].key=l->r[j+1].key l->r[j+1].key=x; change=TRUE; } }

for(int m=1;m<=l->length;m++) cout<r[m].key<<\cout<

}

c.快速排序

int qkpass(recordlist * l,int left,int right) {

int x=l->r[left].key; int low=left; int high=right; while(low

while(lowr[high].key >=x) high--;

if(low

l->r[low].key =l->r[high].key low++; }

while(lowr[high].key

if(low

l->r[high].key=l->r[low].key; high--; } }

l->r[low].key=x; return low; }

void qksort(recordlist *l,int low,int high) {

int pos;

if(low<=high) {

pos=qkpass(l,low,high); qksort(l,low,pos-1); qksort(l,pos+1,high); } }

d.简单选择排序

void selectsort(recordlist * l) {

int i,j,k,x,n;

for(i=1;i<=n-1;++i) {

k=i;

for(j=i+1;j<=n;++j) {

if(l->r[j].keyr[k].key) k=j;

if(k!=i) {

x=l->r[i].key;

l->r[i].key=l->r[k].key; l->r[k].key=x; } } } }

四、测试数据与实验结果

1.直接插入排序

2.冒泡排序

3.快速排序

4.简单选择排序

5.顺序查找

五、实验总结

通过本次实验我对查找排序的应用有了相对的了解。通过自己数次的调试、修改也搞懂了许多以前比较模糊的知识点,比如这次的界面是复制过来的,其中很多语句经过同学的帮助及查找资料后可以理解。但这次实验也有很多不尽人意的地方,程序与老师的要求可能会有些出入我将在以后的试验中会加强自己的编程能力,多学习同学优秀的地方.也会在以后的学习过程中要尽量考虑周全。

六、源代码

#include #include #define maxsize 12 #define listsize 10 #define keysize 10 #define MAX 100 #define radix 10

typedef int keytype; typedef struct {

string xingming; //姓名 string xingbei; //性别 float xuehao; //学号

float chengji1,chengji2; //成绩1,成绩2

float zong; //总分 int key; int next; }recordtype; typedef struct {

recordtype r[listsize +1]; int length; }recordlist;

typedef int pvector[radix]; //直接插入排序

void inssort(recordlist * l) {

int j;

for(int i=2;i<=l->length;i++) {

l->r[0].key=l->r[i].key; j=i-1;

while(l->r[0].keyr[j].key) {

l->r[j+1].key =l->r[j].key; j=j-1; }

l->r[j+1].key=l->r[0].key; }

for(int m=1;m<=l->length;m++) cout<r[m].key<<\cout<

//冒泡排序

void bubblesort(recordlist * l) {

int i,j,x;

int change=TRUE;

for(i=1;i<=l->length && change;++i) {

change=FALSE;

for(j=1;j<=l->length-i;++j)

if(l->r[j].key>l->r[j+1].key) {

x=l->r[j].key;

l->r[j].key=l->r[j+1].key l->r[j+1].key=x; change=TRUE;

} }

for(int m=1;m<=l->length;m++) cout<r[m].key<<\cout<

//简单选择排序

void selectsort(recordlist * l) {

int i,j,k,x,n;

for(i=1;i<=n-1;++i) {

k=i;

for(j=i+1;j<=n;++j) {

if(l->r[j].keyr[k].key) k=j;

if(k!=i) {

x=l->r[i].key;

l->r[i].key=l->r[k].key; l->r[k].key=x; } } } }

//快速排序

int qkpass(recordlist * l,int left,int right) {

int x=l->r[left].key; int low=left; int high=right; while(low

while(lowr[high].key >=x) high--;

if(low

l->r[low].key =l->r[high].key low++; }

while(lowr[high].key

if(low

{

l->r[high].key=l->r[low].key; high--; } }

l->r[low].key=x; return low; }

void qksort(recordlist *l,int low,int high) {

int pos;

if(low<=high) {

pos=qkpass(l,low,high); qksort(l,low,pos-1); qksort(l,pos+1,high); } }

//顺序查找

void chaxun(SqList &ST) //查询信息 {

cout<<\ cout<<\根据学号查询 ~\ cout<<\根据姓名查询 ~\ cout<<\根据性别查询 ~\ cout<<\退出 ~\

cout<<\ cout<<\输入要查找的姓名\ cin>>name;

for(int i=0;i

if(name==ST.r[i].xingming) {

cout<

void main()

{

本文来源:https://www.bwwdw.com/article/tgev.html

Top