二分查找相比于遍历的时间复杂的大大减低。
遍历一个长度为n的数组,时间复杂度为O(n)
而二分查找的时间复杂度是O(logn)
f(x)=log2x 这个函数随着X增长 f(x)增长速度越来越慢,函数图像越来越平缓。
所以二分查找,大大的增大了算法的效率。
二分查找基本思想是:例如1 2 3...100 一个长度为100的数组 要查找数字75
用begin代表查找开始位置 end代表查找结束位置
先将数组二分 begin=0 end=100 mid=(end+begin)/2 mid为中间位置
将75与50做比较 75>50 可推断 75一定在[51,100]这个区间内 这个区间的中间位置为mid=(51+100)/2=75
再进行一次查找 恰好75==mid 查找到所需的元素
在1~100 100个数中查找75 只用了2次循环就完成了 而且可以根据二分法的原理推出100个数 最多只需要查找 log2(100)=7 次
对任意个数 最多只需要查找log2(n)次
具体代码如下:
#include<stdio.h>
int main()
{
int list[10001],i,begin=0,end,n,mid,flag=0,count=0;
for(i=0;i<10001;i++)
list[i]=i;
printf("input the number you want to find\n");
scanf("%d",&n);
end=sizeof(list)/sizeof(list[0]);
while(begin<=end)
{
count++;
mid=(begin+end)/2;
if(n>list[mid])
{
begin=mid+1;
}else if(n<list[mid])
{
end=mid-1;
}else
{
flag=1;
break;
}
}
if(flag)printf("find it count=%d\n",count);
else printf("Not find\n");
return 0;
}