《实验8查找与排序算法的实现和应用》由会员分享,可在线阅读,更多相关《实验8查找与排序算法的实现和应用(13页珍藏版)》请在金锄头文库上搜索。
1、陕 西 科 技 大 学 实 验 报 告1班级学号姓名实验组别实验日期室温报告日期成绩报告内容:(目的和要求、原理、步骤、数据、计算、小结等) 实验名称:查找与排序算法的实现和应用 实验目的: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 二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表, 且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先, 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程, 直到找到满足条件的记录,使查找成功, 或直到子表不存在为止,此时查找不成功。2. 哈希查找:哈希查找的操作步骤:用给定的哈希函数构造哈希表;根据选择的冲突处理方法解决地址冲突;在
5、哈希表的基础上执行哈希查找。哈希查找的本质是先将数据映射成它的哈希值。哈希查找的核心是构造一个哈希函数,它将原来直观、 整洁的数据映射为看上去似乎是随机的一些整数。哈希查找的产生有这样一种背景有些数据本身是无法排序的(如图像 ) ,有些数据是很难比较的( 如图像 ) 。如果数据本身是无法排序的,就不能对它们进行比较查找。如果数据是很难比较的,即使采用折半查找, 要比较的次数也是非常多的。因此,哈希查找并不查找数据本身,而是先将数据映射为一个整数 ( 它的哈希值 ) , 并将哈希值相同的数据存放在同一个位置一即以哈希值为索引构造一个数组。在哈希查找的过程中,只需先将要查找的数据映射为它的哈希值,
6、然后查找具有这个哈希值的数据, 这就大大减少了查找次数。如果构造哈希函数的参数经过精心设计,内存空间也足以存放哈希表,查找一个数据元素所需的比较次数基本上就接近于一次。3. 排序算法 : 排序 (Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。流程图:是否实验代码:一、查找法1、顺序查找#include #define MAX 100 用户输入中序遍历排序创建二叉树输入查找条件输出结果是否继续结束开始附页3 typedef int keytype; typedef struct keytype key; elem
7、type; 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= printf(“请输入顺序表的长度:“); scanf(“%d“, create_seq(list); printf(“创建的顺序表内容:n“); for(i=0;ilength;i+) printf(“list.e
8、lem%d.key=%dn“,i+1,list-elemi.key); printf(“输入查找关键字:“); scanf(“%d“, 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“, int seq_search(SStable*list,keytype k) int i=0,flag=0; while(ilength) if(list-elemi.k
9、ey=k) printf(“查找成功 .n“); flag=1; printf(“list.elem%d.key=%dn“,i+1,k); i+; 附页4 if(flag=0) printf(“没有找到数据 %d!n“,k); return(flag); 2、 折半查找#include #define MAX 100 typedef struct int elemMAX+1; int length; Stable; void creat_seq(Stable*list); int sort_seq(Stable*list); int bin_search(Stable*list,int k,i
10、nt low,int higt); void main() Stable *list,table; int i,key; list= printf(“请输入线性表的长度:“); scanf(“%d“, 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“, bin_search(list,key,1,list-length); void creat_seq
11、(Stable*list) int i; printf(“请输入顺序表的内容:n“); for(i=1;ilength;i+) printf(“list.elem%d.key=“,i); scanf(“%d“, int sort_seq(Stable*list) int i,j,flag; for(i=1;ilength;i+) flag=0; 附页5 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-elem
12、0; 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); else if(list-elemmid #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 附页6 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)
14、if(p-keyk 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“); 附页7 scanf(“%d“, p=(bnode
15、*)malloc(sizeof(bnode); p-key=k; p-lchild=NULL; p-rchild=NULL; scanf(“%d“, while (k0) ins_bitree(p,k); scanf(“%d“, printf(“n“); printf(“二叉树排序的结果:“); inorder(p); printf(“n请输入查找的值:n“); scanf(“%d“, bit_search(p,k); 4、哈希表查找#include #define MAX 11 void ins_hash(int hash,int key) int k,k1,k2; k=key%MAX; if(hashk=0) hashk=key; return ; else k1=k+1; while(k1 #include #define size 11 typedef char datatype; typedef struct int key; datatype others; rectype; void INSERTSORT(rectype R) int i,j; for (i=2;i0) for(j=h;j=0) if(i