直接线上二分查找的递归实现和循环实现的代码
还是不习惯用指针和链表,所以直接用数组来存。代码如下:
递归实现:
#include "stdio.h"
int BinarySearch(int target,int head,int rear);
int num[11]={1,2,3,4,5,6,7,8,9,10,11};
int main()
{
int target,ans;
scanf("%d",&target);
ans = BinarySearch(target,0,11);
if(ans == 0)printf("NO");
else if(ans != 0)printf("YES,下标为%d",ans);
return 0;
}
int BinarySearch(int target,int head,int rear)
{
int middle;middle=(head+rear)/2;
if(rear==head)
{
if(num[middle] == target) return 1;
else return 0;
}
if(num[middle]>target)
{
BinarySearch(target,head,middle-1); //这里需要注意,这里必须传middle-1,不能是middle,
//num[middle]已经大于target了,所以再传过去没有意义,
//直接传middle-1就行了。如果穿middle会产生bug,最后一个数字会
//检测不到,因为除2是取整运算,如果middle不-1会死循环,可以自己
//手写一下就明白了
}
else if(num[middle]<target)
{
BinarySearch(target,middle+1,rear); //middle+1同上
}
else if(num[middle]==target)
{
return middle;
}
}
循环实现:
#include "stdio.h"
int BinarySearch(int num[],int len,int target);
int num[11]={1,2,3,4,5,6,7,8,9,10,11};
int main()
{
int target,ans;
scanf("%d",&target);
ans = BinarySearch(num,11,target);
if(ans == 0)printf("NO");
else if(ans != 0)printf("YES,下标为%d",ans);
return 0;
}
int BinarySearch(int num[],int len,int target)
{
int head=0,rear=len,middle;
while(head<=rear)
{
middle=(head+rear)/2;
if(num[middle]<target) head=middle+1;
else if(num[middle]>target) rear=middle-1;
else return middle;
}
return 0;
}
总结二分查找很快,比顺序结构还要快,顺序结构需要一个一个找,复杂度是O(n),而二分查找复杂度是O(log2N),为什么二分这么快呢?原因是,二分查找必须事先对元素进行有序化处理,也就是排序,上面的代码的例子的数组都是从小到大的排序的,根据查找顺序可以构造出下列那样的东东表述
上面这个树阐明了我们二分查找算法的一个比较顺序,比如要查9,依据二分查找,先找中值6,也就是树的第一个结点6,判断9比6大于是往右下走,直接找到9,也就是说用二分的方式查找只需要2次查找就行。你要找哪个数要几次全部取决于这棵树的深度,深度是几就要找几次。
启示:如果我们不把数据放到数组,而是把数据存入上面这样的树的结构中,是不是就可以更加快速地查找了呢?