线性搜索
- 在一个数组中找到某个数的位置(或者确认是否存在)
- 基本方法:遍历
举个例子,在数组{1,3,5,6,8,9,15,18,20,22,26,45}中找是否有15这个数,以及位置
#include<stdio.h>
int search(int key, int a[], int len)
{
int ret = -1;
for( int i=0; i<len; i++)
{
if (key == a[i])
{
ret = i;
break;
}
}
return ret;
}
int main()
{
int a[] = {1,3,5,6,8,9,15,18,20,22,26,45};
int r = search(15, a ,sizeof(a)/sizeof(a[0]));
printf("%d\n",r);
return 0;
}
二分搜索
下面我们举个例子,通过用二分搜索来解决问题
有这么一个数组a,当然的是按顺序排好的,因为二分查找的前提是要排序。
{2,4,7,11,13, 16 ,21,25,27,32,36,40,46} 总共13个数
对应的下标依次为0,1,2,3,4,5,6,7,8,9,10,11,12
我们设几个变量,left指我要搜索的这个数组的最左边的下标,right指这个数组的最右边的下标 mid指数组中间的下标
mid=(left+right)/ 2 比如现在我们要找36这个数的位置
我们先求出a[mid]为21,因为21<36,所以我们舍去mid前面的那么数,即将left=mid+1
这下就剩了一半,我们再次计算mid=(7+12)/2 这里按9还是按10都是可以的,不影响结果
我们当成9来计算,a[9]=32 < 36 所以还是将left=mid+1 于是left移动到下标为10这里
这下mid=(10+12)/2=11 此时a[11]=40 > 36 ,所以将right=mid-1 移动到和left一样的位置
此时mid=(10+10)/2=10,a[10]=36 我们就找到了36
#include<stdio.h>
int search(int k, int a[], int len)
{
int ret = -1;
int left = 0;
int right = len-1;
while ( right >= left )
{
int mid = (left+right)/2;
if ( a[mid] == k)
{
ret = mid;
break;
}else if ( a[mid]>k)
{
right = mid-1;
}else{
left = mid+1;
}
}
return ret;
}
int main()
{ int k=36;
int a[] = {2,4,7,11,13,16,21,25,27,32,36,40,46};
int r = search(k, a ,sizeof(a)/sizeof(a[0]));
printf("%d\n",r);
return 0;
}