十二顺序查找和二分查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验十二实现顺序和二分查找算法
班级计算机三班学号 2009131334 姓名尹亮
一、实验目的
掌握顺序和二分查找算法的基本思想及其实现方法。
二、实验内容
对给定的任意数组(设其长度为n),分别用顺序和二分查找方法在此数组中查找与给定值k相等的元素。
三、实验要点及说明
查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)的操作,应用十分广泛。
顺序查找是一种最简单的查找方法。它的基本思路是:从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。
二分查找也称为折半查找要求线性表中的结点必须己按关键字值的递增或递减顺序排列。它首先用要查找的关键字k与中间位置的结点的关键字相比较,这个中间结点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间结点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的结点或者该线性表中没有这样的结点。
#include
#define maxl 100
typedef int keytype;
typedef char infotype [10];
typedef struct
{
keytype key;
infotype data;
}nodetype;
typedef nodetype seqlist[maxl];
int binsearch(seqlist r,int n,keytype k)
{
int low=0,high=n-1,mid,count=0;
while (low<=high)
{
mid=(low+high)/2;
printf("第%d次查找:在[%d,%d]中查找到元素r[%d]:%d\n",++count,low,high,mid,r[mid].key);
if(r[mid].key==k)
return mid;
if(r[mid].key>k)
high=mid-1;
else
low=mid+1;
}
return -1;
}
int seqsearch(seqlist r,int n,keytype k) {
int i=0;
while (i { printf(" %d ",r[i].key); i++; } if(i>=n) return -1; else { printf(" %d ",r[i].key ); return i; } } void main() seqlist r; int n=10; keytype k=5; int a[]={3,6,2,10,1,8,5,7,4,9},i; for(i=0;i r[i].key=a[i];//建立顺序表 printf("\n"); printf("二分法查找:\n"); if((i=binsearch(r,n,k))!=-1) printf("元素%d的位置是%d\n",k,n); else printf("元素%d不在表中\n",k); printf("\n"); printf("顺序查找:\n"); if((i=seqsearch(r,n,k))!=-1) printf("\n元素%d的位置是%d\n",k,i); else printf("\n元素%d不在表中\n",k); printf("\n"); 算法思想: 顺序查找 从表的一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k 相比较,若当前扫描到的关键字与k 相等,则查找成功;若扫 描结束,仍未扫描到关键字,则查找失败。 二分查找: 设r[low..high]是当前的查找区间,首先确定该区间的中点位置mid=(low+high)/2,然后将待查的k值与r[mid].key比较:(1)若r[mid].key=k,则查找成功并返回该位置。 (2)若r[mid].key>k,则由表的有序性可知r[mid..n-1].key 均大于k,因此若表中存在关键字等于k的记录,则该记录 必定在位置mid左边的子表 (3)若r[mid].key 四实验结论 经过试验掌握了顺序查找和二分查找的算法及其实现的程序。