




已阅读5页,还剩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.顺序查找:在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺点是效率低下。二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。2.哈希查找:哈希查找的操作步骤:用给定的哈希函数构造哈希表;根据选择的冲突处理方法解决地址冲突;在哈希表的基础上执行哈希查找。 哈希查找的本质是先将数据映射成它的哈希值。哈希查找的核心是构造一个哈希函数,它将原来直观、整洁的数据映射为看上去似乎是随机的一些整数。哈希查找的产生有这样一种背景有些数据本身是无法排序的(如图像),有些数据是很难比较的(如图像)。如果数据本身是无法排序的,就不能对它们进行比较查找。如果数据是很难比较的,即使采用折半查找,要比较的次数也是非常多的。因此,哈希查找并不查找数据本身,而是先将数据映射为一个整数(它的哈希值),并将哈希值相同的数据存放在同一个位置一即以哈希值为索引构造一个数组。在哈希查找的过程中,只需先将要查找的数据映射为它的哈希值,然后查找具有这个哈希值的数据,这就大大减少了查找次数。如果构造哈希函数的参数经过精心设计,内存空间也足以存放哈希表,查找一个数据元素所需的比较次数基本上就接近于一次。 3.排序算法: 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。开始流程图:输入查找条件用户输入输出结果排序创建二叉树 是是否继续中序遍历 否结束实验代码:一、查找法1、顺序查找#include #define MAX 100typedef int keytype; typedef struct keytype key;elemtype;typedef struct elemtype elemMAX+1; int length;SStable;void create_seq(SStable*list);int seq_search(SStable*list,keytype k);void main() SStable *list,table; keytype key;int i;list=&table;printf(请输入顺序表的长度:);scanf(%d,&list-length);create_seq(list);printf(创建的顺序表内容:n);for(i=0;ilength;i+)printf(list.elem%d.key=%dn,i+1,list-elemi.key);printf(输入查找关键字:);scanf(%d,&key);seq_search(list,key);void create_seq(SStable *list) int i; printf(请输入顺序表的内容:n);for(i=0;ilength;i+) printf(list.elem%d.key=,i+1); scanf(%d,&list-elemi.key);int seq_search(SStable*list,keytype k) int i=0,flag=0; while(ilength) if(list-elemi.key=k) printf(查找成功.n); flag=1; printf(list.elem%d.key=%dn,i+1,k);i+;if(flag=0)printf(没有找到数据%d!n,k);return(flag);2、 折半查找#include#define MAX 100typedef struct int elemMAX+1;int length;Stable;void creat_seq(Stable*list);int sort_seq(Stable*list);int bin_search(Stable*list,int k,int low,int higt);void main() Stable *list,table;int i,key;list=&table;printf(请输入线性表的长度:);scanf(%d,&list-length);creat_seq(list);sort_seq(list);printf(排列后的数据n);for(i=1;ilength;i+)printf(list.elem%d.key=%dn,i,list-elemi);printf(n请输入查找的值:);scanf(%d,&key);bin_search(list,key,1,list-length);void creat_seq(Stable*list) int i;printf(请输入顺序表的内容:n);for(i=1;ilength;i+)printf(list.elem%d.key=,i);scanf(%d,&list-elemi);int sort_seq(Stable*list) int i,j,flag;for(i=1;ilength;i+)flag=0;for(j=1;jlength-i+1;j+)if (list-elemjlist-elemj+1)list-elem0=list-elemj+1;list-elemj+1=list-elemj;list-elemj=list-elem0;flag=1;if(flag=0)return 1;int bin_search(Stable*list,int k,int low,int high) int mid;if(lowhigh) printf(没有找到要查找的值n);return(0);mid=(low+high)/2;if(list-elemmid=k) printf(查找成功n);printf(list%d=%dn,mid,k);return(mid);elseif(list-elemmidk)return(bin_search(list,k,mid+1,high);elsereturn(bin_search(list,k,low,mid-1);3、 二叉树查找#include #include typedef struct bitnodeint key;struct bitnode *lchild; struct bitnode *rchild;bnode;void ins_bitree(bnode *p,int k)bnode *q;if(p-key k&p-lchild)ins_bitree(p-lchild,k);else if(p-keyrchild)ins_bitree(p-rchild,k);else q=(bnode *)malloc(sizeof(bnode);q-key=k;q-lchild=NULL; q-rchild=NULL;if(p-keyk)p-lchild=q;else p-rchild=q;void bit_search(bnode *p,int k)if(p-keyk&p-lchild)bit_search(p-lchild,k);else if(p-keyrchild)bit_search(p-rchild,k);else if(p-key =k)printf(查找成功!n);else printf(%d不存在!n);void inorder(bnode *p)if(p)inorder(p-lchild);printf(%4d,p-key);inorder(p-rchild);void main () int k;bnode *p;p=NULL;printf(请输入二叉树结点的值,输入0结束:n);scanf(%d,&k);p=(bnode *)malloc(sizeof(bnode);p-key=k;p-lchild=NULL;p-rchild=NULL;scanf(%d,&k);while (k0)ins_bitree(p,k);scanf(%d,&k);printf(n);printf(二叉树排序的结果:);inorder(p);printf(n请输入查找的值:n);scanf(%d,&k);bit_search(p,k);4、哈希表查找#include #define MAX 11void ins_hash(int hash,int key)int k,k1,k2;k=key%MAX;if(hashk=0)hashk=key;return ;elsek1=k+1;while(k1MAX&hashk1!=0)k1+;if(k1MAX)hashk1=key;return ; k2=0; while(k2k&hashk2!=0)k2+;if(k2k) hashk2=key; return ;void out_hash(int hash)int i;for(i=0;iMAX;i+)if(hashi)printf(hash%d=%dn,i,hashi);void hash_search(int hash,int key)int k,k1,k2,flag=0;k=key%MAX;if(hashk=key)printf(hash%d=%d,k,key);flag=1;else k1=k+1;while(k1MAX&hashk1!=key)k1+;if(k1MAX)printf(hash%d=%d,k1,key);flag=1;k2=0;if(!flag)while(k2k&hashk2!=key)k2+;if(k2k)printf(hash%d=%d,k2,key);flag=1;if(flag)printf(查找成功!n);return;elseprintf(查找失败!n);return;void main()int i,key,k,sum=0;int hashMAX;for(i=0;iMAX;i+)hashi=0;printf(请输入数据,以0结束:n);scanf(%d,&key);sum+;while(key&sumMAX)ins_hash(hash,key);scanf(%d,&key);sum+;printf(n);out_hash(hash);printf(n);printf(请输入查找的值:);scanf(%d,&k);hash_search(hash,k);printf(n);二、排序算法#include#include#define size 11typedef char datatype;typedef struct int key;datatype others;rectype;void INSERTSORT(rectype R) int i,j;for (i=2;i=size;i+) R0=Ri;j=i-1;while (R0.key0)for(j=h;j=0)&temp.key=temp.key)&(ij)j-;if(ij)Ri+=Rj;while (Ri.key=temp.key)&(ij)i+;if(ij) Rj-=Ri;while(i!=j);Ri=temp; return i;void QUICKSORT(rectype R,int s1,int t1) int i; if(s1t1) i=PARTITION(R,s1,t1); QUICKSORT(R,s1,i-1); QUICKSORT(R,i+1,t1); void main() rectype Rsize; int i; printf(请输入使用插入算法排序的10个数据n); for(i=1;isize;i+) scanf(%d,&Ri.key); printf(n插入排序之前n); for(i=1;isize;i+) printf(%dt,Ri.key); INSERTSORT(R); printf(n插入排序之后n);for(i=1;isize;i+) printf(%dt,Ri.key);printf(n请输入使用希尔顿算法排序的10个数据n);for(i=0;isize-1;i+) scanf(%d,&Ri.key);printf(n希尔排序之前n);for(i=0;isize-1;i+) printf(%dt,Ri.key);SHELLSORT(R,10); printf(n希尔排序之后n);for(i=0;isize-1;i+) printf(%dt,Ri.key); printf(请输入使用快速算法排序的10个数据n); for(i=1;isize;i+) scan
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 稿件翻译服务合作合同5篇
- 员工劳动合同正式版范本2篇
- 垂直铺塑工程合同3篇
- 天车维修检测合同范本
- 投资入股公司合同范本
- 橱柜安装的合同范本
- 抵押合同范本协议
- 即墨路租房合同范本
- 台球厂商文字合同范本
- 小型水池建筑合同范本
- 初一启新程扬帆再出发-2025-2026学年上学期七年级(初一)开学第一课主题班会课件
- 电池火灾安全知识培训课件
- 2025年CAD机械制图考试题库及答案
- Z20名校联盟(浙江省名校新高考研究联盟)2026届高三第一次联考 语文试卷(含答案详解)
- 2025工会基础知识考试题库及参考答案
- 2025年安徽省宿州市辅警协警笔试笔试测试卷(含答案)
- 2024广西公需课高质量共建“一带一路”谱写人类命运共同体新篇章答案
- 2025年国家法律职业资格考试《客观题卷一》模拟题及答案
- 冷板液冷标准化及技术优化白皮书
- 2025四川成都新都投资集团有限公司招聘23人笔试历年参考题库附带答案详解
- 中班健康《我会用伞》
评论
0/150
提交评论