第三章 引子(二分查找) 递归和循环分别实现

直接线上二分查找的递归实现和循环实现的代码

还是不习惯用指针和链表,所以直接用数组来存。代码如下:

递归实现:

#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次查找就行。你要找哪个数要几次全部取决于这棵树的深度,深度是几就要找几次。

启示:如果我们不把数据放到数组,而是把数据存入上面这样的树的结构中,是不是就可以更加快速地查找了呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值