实验十二实现顺序和二分查找算法[管理资料] 实验十二实现顺序和二分查找算法姓名:张就班级:09计算机一班学
号:2009111111
一、实验目的
掌握顺序和二分查找算法的基本思想及其实现方法。
二、实验内容
对给定的任意数组(设其长度为n),分别用顺序和二分查找方法在此数组中查找与给定值k相等的元素。
三、算法思想与算法描述
1、顺序查找,在顺序表R[0..n-1]中查找关键字为k的记录,成功时返回找到的记录位置,失败时返回-1,具体的算法如下所示:
int SeqSearch(SeqList R,int n,KeyType k)
{
int i=0;
while(i<n&&R[i].key!=k)
{
printf("%d",R[i].key);
i++;
}
if(i>=n)
return -1;
else
{
printf("%d",R[i].key);
return i;
}
}
2、二分查找,在有序表R[0..n-1]中进行二分查找,成功时返回记录
的位置,失败时返回-1,具体的算法如下:
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;
}
四、实验步骤与算法实现
#include<stdio.h>
#define MAXL 100
typedef int KeyType;
typedef char InforType[10]; typedef struct
{
KeyType key;
InforType data;
}NodeType;
typedef NodeType SeqList[MAXL]; int SeqSearch(SeqList R,int n,KeyType k) {
int i=0;
while(i<n&&R[i].key!=k)
{
printf("%d",R[i].key);
i++;
}
if(i>=n)
return -1;
else
{
printf("%d",R[i].key);
return i;
}
}
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 BinSearch1(SeqList R,KeyType k, int low,int high) {
int mid;
if(low>high)
return -1;
mid=(low+high)/2;
if(k==R[mid].key)
return mid;
else if(k<R[mid].key)
return BinSearch1(R,k,low,mid-1); else
return BinSearch1(R,k,mid+1,high); } void main(){
SeqList R;
int n=10;
KeyType k=7;
int a[]={1,5,3,4,2,6,7,11,9,10},i;
for(i=0;i<n;i++)
R[i].key=a[i];
printf("\n");
if((i=SeqSearch(R,n,k))!=-1)
printf("\n元素%d的位置是%d\n",k,i); else
printf("\n元素%d的位置不在表中\n",k); printf("\n");
if((i=BinSearch(R,n,k))!=-1)
printf("\n元素%d的位置是%d\n",k,i); else
printf("\n元素%d的位置不在表中\n",k); printf("\n");
if((i=BinSearch1(R,k,0,7))!=-1)
printf("\n元素%d的位置是%d\n",k,i); else
printf("\n元素%d的位置不在表中\n",k); printf("\n");
}
五、实验测试及结果
程序完全正确的执行结果,如图所示:
六、总结与体会
通过这次在实现顺序和二分查找算法的过程中,让我对顺序和二分查找算法有了更多的了解。
查找根据给定的某个值,在查找表中确定一个其关键字等于给定值的数据元素或(记录)的操作,应用十分广泛。
顺序查找是一种最简单的查找方法。
它的基本思路是:从表的
一端开始,顺序扫描线性表,依次将扫描到的关键字和给定值k相比较,若当前扫描到的关键字与k相等,则查找成功;若扫描结束后,仍未找到关键字等于k的记录,则查找失败。
二分查找也称为折半查找要求线性表中的结点必须己按关键字值的递增或递减顺序排列。
它首先用要查找的关键字k与中间位置的结点的关键字相比较,这个中间结点把线性表分成了两个子表,若比较结果相等则查找完成;若不相等,再根据k与该中间结点关键字的比较大小确定下一步查找哪个子表,这样递归进行下去,直到找到满足条件的结点或者该线性表中没有这样的结点。
在学习过程中,善于发现,会找到更多的捷径。