二分查找算法,又叫折半查找算法,顾名思义,从其名字可见该排序算法运用了二分法进行查找。所谓二分就是将一个数组分成两部分,因为每次都是二分所以又叫折半查找,个人觉得折半很形象。
二分查找有两个要求,一个是数列有序,另一个是数列使用顺序存储结构(比如数组)。
二分查找算法仅适用于有序序列,它只能用在升序序列或者降序序列中查找目标元素。
图解:
以数组
为例,我们查找32。
第一步l=0,r=10,mid=(l+r)/2=5。
45>32所以现在更新r的值为5
第二步: l=0,r=5,mid=(l+r)/2=2
25<32所以将I的值更新为mid的值。
第三步:l=2,r=5,mid=(l+r)/2=3
32=32所以就查找到了。直接输出mid的值即可。
可能因为数据规模较小所以觉得还没有直接遍历查找来得快,但是如果数据规模很大呢
100000个数,这样遍历查找就很麻烦了,所以折半查找还是很快的。
代码:
大概就是先用快排先将无序数组变为有序数组,然后再调用折半查找函数,利用了递归的方法,进行查找。不断的更新中间值mid,以达到差数的目的
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int binarysearch(int *a,int l,int r,int num);
int camp(void *a,void *b)
{
return *(int *)a-*(int *)b;
}
int main()
{
int i;
int n;
scanf("%d",&n);
int a[n];
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
qsort(a,n,sizeof(a[0]),camp);
for(i=0;i<n;i++)
{
printf("%d ",a[i]);//原数组(顺序排序)
}
printf("\n");
int num;
scanf("%d",&num);//要查找的数
int aim=binarysearch(a,0,n,num);//aim为要查找的数再数组中的位置
printf("%d",a[aim]);
}
int binarysearch(int *a,int l,int r,int num)
{
int mid;
mid=(r+l)/2;
if(a[mid]=num)
{
return mid;
}
if(a[mid]>num)
{
binarysearch(a,l,mid,num);
}
if(a[mid]<num)
{
binarysearch(a,mid,r,num);
}
}