ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:206.93KB ,
资源ID:9704216      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/9704216.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(实验8查找与排序算法的实现和应用.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

实验8查找与排序算法的实现和应用.docx

1、实验8查找与排序算法的实现和应用班级 学号 姓名 实验组别 实验日期 室温 报告日期 成绩 报告内容:(目的和要求、原理、步骤、数据、计算、小结等)实验名称:查找与排序算法的实现和应用实验目的:1.掌握顺序表中查找的实现及监视哨的作用。2.掌握折半查找所需的条件、折半查找的过程和实现方法。3.掌握二叉排序树的创建过程,掌握二叉排序树查找过程的实现。4.掌握哈希表的基本概念,熟悉哈希函数的选择方法,掌握使用线性探测法和链地址法进行冲突解决的方法。5.掌握直接插入排序、希尔排序、快速排序算法的实现。实验环境(硬/软件要求):Windows 2000,Visual C+ 6.0实验内容: 通过具体算

2、法程序,进一步加深对各种查找算法的掌握,以及对实际应用中问题解决方法的掌握。各查找算法的输入序列为:26 5 37 1 61 11 59 15 48 19 输出要求:查找关键字37,给出查找结果。对于给定的某无序序列,分别用直接插入排序、希尔排序、快速排序等方法进行排序,并输出每种排序下的各趟排序结果。各排序算法输入的无序序列为:26 5 37 1 61 11 59 15 48 19。实验要求:一、查找法1.顺序查找首先从键盘输入一个数据序列生成一个顺序表,然后从键盘上任意输入一个值,在顺序表中进行查找。2.折半查找任意输入一组数据作为个数据元素的键值,首先将此序列进行排序,然后再改有序表上使

3、用折半查找算法进一对给定值key的查找。3.二叉树查找任意输入一组数据作为二叉排序树中节点的键值,首先创建一颗二叉排序树,然后再次二叉排序树上实现对一定k的查找过程。 4.哈希表查找 任意输入一组数值作为个元素的键值,哈希函数为Hash(key)=key%11,用线性探测再散列法解决冲突问题。二、排序算法编程实现直接插入排序、希尔排序、快速排序各算法函数;并编写主函数对各排序函数进行测试。实验原理:1.顺序查找:在一个已知无(或有序)序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的数从最后一个开始逐个比较,直到找出与给定关键字相同的数为止,它的缺点是效率低下。二分查找又称折

4、半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。2.哈希查找:哈希查找的操作步骤:用给定的哈希函数构造哈希表;根据选择的冲突处理方法解决地址冲突;在哈希表的基础上执行哈希查找。 哈

5、希查找的本质是先将数据映射成它的哈希值。哈希查找的核心是构造一个哈希函数,它将原来直观、整洁的数据映射为看上去似乎是随机的一些整数。哈希查找的产生有这样一种背景有些数据本身是无法排序的(如图像),有些数据是很难比较的(如图像)。如果数据本身是无法排序的,就不能对它们进行比较查找。如果数据是很难比较的,即使采用折半查找,要比较的次数也是非常多的。因此,哈希查找并不查找数据本身,而是先将数据映射为一个整数(它的哈希值),并将哈希值相同的数据存放在同一个位置一即以哈希值为索引构造一个数组。在哈希查找的过程中,只需先将要查找的数据映射为它的哈希值,然后查找具有这个哈希值的数据,这就大大减少了查找次数。

6、如果构造哈希函数的参数经过精心设计,内存空间也足以存放哈希表,查找一个数据元素所需的比较次数基本上就接近于一次。 3.排序算法: 排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。流程图: 是 否实验代码:一、查找法1、顺序查找#include #define MAX 100typedef int keytype; typedef struct keytype key;elemtype;typedef struct elemtype elemMAX+1; int length;SStable;void cre

7、ate_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

8、(%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%

9、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=&tabl

10、e;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(l

11、ist.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 hig

12、h) 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 bitnode int key; struct

13、 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

14、 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(请输入二叉树

15、结点的值,输入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) in

16、t k,k1,k2; k=key%MAX; if(hashk=0) hashk=key; return ; else k1=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,in

17、t 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

18、;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 11typed

19、ef 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,in

20、t 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+) p

21、rintf(%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+) scanf(%d,&Ri.key); printf(n快速排序之前

22、n); for(i=1;isize;i+) printf(%dt,Ri.key); QUICKSORT(R,1,10); printf(n快速排序之后n); for(i=1;isize;i+) printf(%dt,Ri.key);实验结果顺序查找:折半查找:二叉树查找:哈希表查找:排序:实验小结: 此次操作证明可以用编程实现查找与排序,实验结果正确。 通过本次实验,我对查找排序与二分查找、哈希查找、二叉树查找等有了更加深刻的了解。练习了指针,查找等操作,熟练掌握树的操作。对各种算法有了更加深刻的理解。通过这次写实验报告,我深切的理解了这门课的本质。刚开始学这门课时,当时还不清楚这门课程的目的

23、,现在,我真正的理解了:数据结构像是身体的骨骼,而C语言是填充这骨骼的肉体,二者相结合才能使整个程序更加完整,健全。数据结构是个框架,模型,抽象数据类型中列举了各种操作,而所用的C语言,将各种操作描述出来构成算法。数据结构+算法=程序设计。在这次设计的过程中,我还遇到了,很多的问题。顺序表是按顺序存储的,用了一维数组来存储,又结合C语言的程序设计,但是,在执行时出现了问题。后来问同学,指出我的错误,不过获益不少。我又重新整理思路,把顺序表的基本操作写好了。虽然走了很多弯路,但是让我认识到,一定要创新,大胆,不能按照旧的思路去干新的事情。但是细节上出了问题。比如说,有些变量的重复定义,有些变量又没有定义,在调用函数,就直接复制过来,没有改参数通过修改,我深刻理解到:细节决定成败,在以后,不管做任何事情都要认真,细心。

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1