搜索 可以分为
线性搜索
二分搜索
散列
线性搜索
即从数组开头顺序访问各元素,检查该元素与目标值是否相等。一旦相等便返回该元素的位置并结束。
1.线性搜索的算法效率很低,不过适用于任何形式的数据
2.引入标记,效率翻倍,含有目标关键字的数据放在数组结尾,用作标记
#include<stdio.h>
int search(int A[],int n,int key)
{
int i=0;
A[n] = key;
while(A[i]!=key) i++;
return i!=n;
}
int main()
{
int i,n,A[10000+1],q,key,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&A[i]);
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%d",&key);
if(search(A,n,key))sum++;
}
printf("%d\n",sum);
return 0;
}
二分搜索
表示搜索范围的变量left,right,中间位置的mid;
left表示开头元素
right表示末尾元素的后一个元素
mid是left与right和的一半
#include<stdio.h>
int A[10000+1],n;
int binarysearch(int key)
{
int left = 0;
int right = n;
int mid;
while(left<right)
{
mid = (left+right)/2;
if(key==A[mid]) return 1;
if(key < A[mid]) right = mid; //搜索前半部分
else if(key>A[mid]) left = mid+1; //搜索后半部分
}
return 0;
}
int main()
{
int i,q,k,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&A[i]);
scanf("%d",&q);
for(i=0;i<q;i++)
{
scanf("%d",&k);
if(binarysearch(k))sum++;
}
printf("%d\n",sum);
return 0;
}