查找、排序的应用
---------------------------------------------------------------最新资料推荐------------------------------------------------------
查找、排序的应用
1 查找、排序的应用一、问题描述对学生的基本信息进行管理。
设计一个学生信息管理系统,学生对象至少要包含:
学号、姓名、性别、成绩 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
1 / 6
分别指向待查元素所在区间的下界、上界和中点, key 为给定值。
初始时,令,让 key 与 mid 指向的记录比较,若 key==r[mid]. key,查找成功若keyr[mid]. key,则high=mid-1 若keyr[mid]. key,则low=mid+1 重复上述操作,直至 lowhigh 时,查找失败 b、顺序查找从表的一端开始逐个进行记录的关键字和给定值的比较。
在这里从表尾开始并把下标为 0 的作为哨兵。
(3) 排序 a、插入排序每步将一个待排序的记录,按其关键码大小,插入到前面已经排好序的一组记录的适当位置上,直到记录全部插入为止。
b、选择排序首先通过 n-1 次关键字比较,从 n 个记录中找出关键字最小的记录,将它与第一个记录交换再通过 n-2 次比较,从剩余的 n-1 个记录中找出关键字次小的记录,将它与第二个记录交换重复上述操作,共进行 n-1 趟排序后,排序结束。
四、测试数据 3 五、源代码----------------------------------------Find
sort.h-------------------------------------------
#includestring 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;//学生总数 4 public: void GreatRT(int);//构
建信息库void BinarySearch();//折半查找void SequentialSearch();//顺序查找 void Insertsort();//插入排序
void SelectSort();//选择排序};
--------------------------------------Find
sort.cpp------------------------------------------
#includeiostream #includeFind sort.h using namespace std; void student::GreatRT(int n) {//信息构建total=n; int i=1;
do{ cout请输入第i个学生的信息:
endl; cout姓名:
; cinrt[i].name; cout性别:
; cinrt[i].sex; cout学号:
; cinrt[i].number; cout成绩 1:
; cinrt[i].grade1; cout成绩 2:
; cinrt[i].grade2; rt[i].score=rt[i].grade1+rt[i].grade2; i++; coutendl; }while(i=total); cout输入完毕! endlendl; } void student::BinarySearch() {//折半查找算法: RecordType LI;
for(int i=2;i=total;i++){//使学号变为有序 5 for(int
j=i;j1;j--){ if(rt[j].numberrt[j-1].number){ LI=rt[j
]; rt[j]=rt[j-1]; rt[j-1]=LI; } } } int
3 / 6
n,m=0; cout输入要查找的学号:
; cinn; 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(nrt[mid].number) high=mid-1;//继续在前半区间进行查找
else low=mid+1;//继续在后半区间进行查找} if(m!=0) coutrt[mid].name rt[mid].sex rt[mid].number rt[mid].grade1 rt[mid].grade2 rt[mid].scoreendlendl; else cout没有你要查找的学号!endlendl; } void student::SequentialSearch() {//顺序查找算法: string name;
int m=0; cout输入要查找的姓名:
; cinname; 6 for(int i=1;i=total;i++){ m=1;
if(name==rt[i].name) coutrt[i].name rt[i].sex rt[i].number rt[i].grade1 rt[i].grade2 rt[i].scoreendl; } if(m==0) cout没有你要查找的姓名!endlendl; else coutendl; } void student::Insertsort() {//
插入排序学号RecordType LI; for(int
i=2;i=total;i++){ for(int
j=i;j1;j--){ if(rt[j].numberrt[j-1].number){ LI=rt[j
]; rt[j]=rt[j-1]; rt[j-1]=LI; } } } for(int
k=1;k=total;k++) coutrt[k].name rt[k].sex rt[k].number rt[k].grade1 rt[k].grade2
---------------------------------------------------------------最新资料推荐------------------------------------------------------
rt[k].scoreendl; coutendl; } void student::SelectSort() {//
选择排序总分RecordType LI; 7 for(int
i=1;i=total;i++){ for (int
j=i+1;j=total;j++){ if(rt[i].scorert[j].score){ LI=r
t[j]; rt[j]=rt[i]; rt[i]=LI; } } } for(int
k=1;k=total;k++) coutrt[k].name rt[k].sex rt[k].number rt[k].grade1 rt[k].grade2 rt[k].scoreendl; coutendl; }
-----------------------------------------main.cpp----------
--------------------------------- #includeiostream
#includeFind sort.h using namespace std; void main() { student st; int n; cout请输入学生总数:
; cinn; st.GreatRT(n); cout学号(插入排序):
endl; st.Insertsort();//插入排序 cout总分(选择排序):
endl; st.SelectSort();//选择排序 st.BinarySearch();//折
半查找 st.SequentialSearch();//顺序查找 } 8 六、总结
本实验综合性非常强,它包含顺序表的存储、查找、排序,而且
多处用到调用的方法,调用贯穿于整个程序之中,用到折半查找和
顺序查找,用到插入排序和选择排序。
通过本实验我对查找和排序这两个章节的内容更加了解,虽然
这两个章节内容学习的时候时间非常紧,有很多不懂和疑问,但是
5 / 6
通过这次实验,有了很好的补充,同时对调用做了一次很好的复习。
实验8查找与排序算法的实现和应用
陕西科技大学实验报告 班级学号姓名实验组别 实验日期室温报告日期成绩 报告内容:(目的和要求、原理、步骤、数据、计算、小结等) 实验名称:查找与排序算法的实现和应用 实验目的: 1. 掌握顺序表中查找的实现及监视哨的作用。 2. 掌握折半查找所需的条件、折半查找的过程和实现方法。 3. 掌握二叉排序树的创建过程,掌握二叉排序树查找过程的实现。 4. 掌握哈希表的基本概念,熟悉哈希函数的选择方法,掌握使用线性探测法和链地址法进行冲突解决的方 法。 5. 掌握直接插入排序、希尔排序、快速排序算法的实现。 实验环境(硬/软件要求):Windows 2000,Visual C++ 6.0 实验内容: 通过具体算法程序,进一步加深对各种查找算法的掌握,以及对实际应用中问题解决方 法的掌握。各查找算法的输入序列为:26 5 37 1 61 11 59 15 48 19输出 要求:查找关键字37,给出查找结果。对于给定的某无序序列,分别用直接插入排序、希尔排序、快速排序等方法进行排序,并输出每种排序下的各趟排序结果。 各排序算法输入的无序序列为:26 5 37 1 61 11 59 15 48 19。 实验要求: 一、查找法 1. 顺序查找 首先从键盘输入一个数据序列生成一个顺序表,然后从键盘上任意输入一个值,在顺序 表中进行查找。 2. 折半查找
任意输入一组数据作为个数据元素的键值,首先将此序列进行排序,然后再改有序表上 使用折半查找算法进对给定值key 的查找。 3. 二叉树查找 任意输入一组数据作为二叉排序树中节点的键值,首先创建一颗二叉排序树,然后再次二叉排序树上实现对一 定k的查找过程。 4. 哈希表查找 任意输入一组数值作为个元素的键值,哈希函数为Hash (key )=key%11, 用线性探测再散列法解决冲突问题。 二、排序算法 编程实现直接插入排序、希尔排序、快速排序各算法函数;并编写主函数对各排序函数进行测试。 实验原理: 1. 顺序查找: 在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺点是效率低下。 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以
查找、排序的应用
查找、排序的应用 一、问题描述 对学生的基本信息进行管理。 设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩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
《数据结构》实验报告——排序.docx
《数据结构》实验报告排序实验题目: 输入十个数,从插入排序,快速排序,选择排序三类算法中各选一种编程实现。 实验所使用的数据结构内容及编程思路: 1. 插入排序:直接插入排序的基本操作是,将一个记录到已排好序的有序表中,从而得到一个新的,记录增一得有序表。 一般情况下,第i 趟直接插入排序的操作为:在含有i-1 个记录的有序子序列r[1..i-1 ]中插入一个记录r[i ]后,变成含有i 个记录的有序子序列r[1..i ];并且,和顺序查找类似,为了在查找插入位置的过程中避免数组下标出界,在r [0]处设置哨兵。在自i-1 起往前搜索的过程中,可以同时后移记录。整个排序过程为进行n-1 趟插入,即:先将序列中的第一个记录看成是一个有序的子序列,然后从第2 个记录起逐个进行插入,直至整个序列变成按关键字非递减有序序列为止。 2. 快速排序:基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录继续进行排序,以达到整个序列有序。 假设待排序的序列为{L.r[s] ,L.r[s+1],…L.r[t]}, 首先任意选取一个记录 (通常可选第一个记录L.r[s])作为枢轴(或支点)(PiVOt ),然后按下述原则重新排列其余记录:将所有关键字较它小的记录都安置在它的位置之前,将所有关键字较大的记录都安置在它的位置之后。由此可以该“枢轴”记录最后所罗的位置i 作为界线,将序列{L.r[s] ,… ,L.r[t]} 分割成两个子序列{L.r[i+1],L.[i+2], …,L.r[t]}。这个过程称为一趟快速排序,或一次划分。 一趟快速排序的具体做法是:附设两个指针lOw 和high ,他们的初值分别为lOw 和high ,设枢轴记录的关键字为PiVOtkey ,则首先从high 所指位置起向前搜索找到第一个关键字小于PiVOtkey 的记录和枢轴记录互相交换,然后从lOw 所指位置起向后搜索,找到第一个关键字大于PiVOtkey 的记录和枢轴记录互相 交换,重复这两不直至low=high 为止。 具体实现上述算法是,每交换一对记录需进行3 次记录移动(赋值)的操作。而实际上,
实验6 查找和排序 (2)(1)
实验六、七:查找、排序算法的应用 班级 10511 学号 20103051114 姓名高卫娜 一、实验目的 1 掌握查找的不同方法,并能用高级语言实现查找算法。 2 熟练掌握顺序表和有序表的顺序查找和二分查找方法。 3 掌握排序的不同方法,并能用高级语言实现排序算法。 4 熟练掌握顺序表的选择排序、冒泡排序和直接插入排序算法的实现。 二、实验内容 1 创建给定的顺序表。表中共包含八条学生信息,信息如下: 学号姓名班级C++ 数据结构 1 王立03511 85 76 2 张秋03511 78 88 3 刘丽03511 90 79 4 王通03511 7 5 86 5 赵阳03511 60 71 6 李艳03511 58 68 7 钱娜03511 95 89 8 孙胜03511 45 60 2 使用顺序查找方法,从查找表中查找姓名为赵阳和王夏的学生。如果查找成功,则显示该生的相关信息;如果查找不成功,则给出相应的提示信息。 3 使用二分查找方法,从查找表中查找学号为7和12的学生。如果查找成功,则显示该生的相关信息;如果查找不成功,则给出相应的提示信息。(注意:创建静态查找表时必须按学号的从小到大排列!) 4 使用直接插入排序方法,对学生信息中的姓名进行排序。输出排序前和排序后的学生信息表,验证排序结果。 5 使用直接选择排序方法,对学生信息中的C成绩进行排序。输出排序前和排序后的学生信息表,验证排序结果。 6 使用冒泡排序方法,对学生信息中的数据结构成绩进行排序。输出排序前和排序后的学生信息表,验证排序结果。 7 编写一个主函数,将上面函数连在一起,构成一个完整程序。 8 将实验源程序调试并运行。 三、实验结果 源程序代码为: #include
(完整word版)查找、排序的应用 实验报告
实验七查找、排序的应用 一、实验目的 1、本实验可以使学生更进一步巩固各种查找和排序的基本知识。 2、学会比较各种排序与查找算法的优劣。 3、学会针对所给问题选用最适合的算法。 4、掌握利用常用的排序与选择算法的思想来解决一般问题的方法和技巧。 二、实验内容 [问题描述] 对学生的基本信息进行管理。 [基本要求] 设计一个学生信息管理系统,学生对象至少要包含:学号、姓名、性别、成绩1、成绩2、总成绩等信息。要求实现以下功能:1.总成绩要求自动计算; 2.查询:分别给定学生学号、姓名、性别,能够查找到学生的基本信息(要求至少用两种查找算法实现); 3.排序:分别按学生的学号、成绩1、成绩2、总成绩进行排序(要求至少用两种排序算法实现)。 [测试数据] 由学生依据软件工程的测试技术自己确定。 三、实验前的准备工作 1、掌握哈希表的定义,哈希函数的构造方法。 2、掌握一些常用的查找方法。 1、掌握几种常用的排序方法。 2、掌握直接排序方法。