二分搜索

分治算法:分治算法就是把一个复杂的问题分成两个相同或相似的子问题,再把子问题分成更小的子问题......知道最后的子问题可以简单地求解,原问题的解即子问题的解的合并。

典型的分治算法就是二分搜索:

二分搜索递归的代码:

#include<stdio.h>

int key, a[20];

int search(int bot, int top)
{
	int mid;
	if(top >= bot)   //第二次错误,此处为if,写成了while
	{
		mid = (top + bot) / 2;  //第一次错误,此处应该为加号写成了减号
		if(key == a[mid])
		{
			printf("%d\n", mid);
			return 0;
		}
		else if(key < a[mid])
		{
			search(bot, mid - 1);
		}
		else
		{
			search(mid + 1, top);
		}
	}
}


int main(void)
{
	int n, i;
	scanf("%d", &n);
	for(i = 1; i <= n; i ++)
	{
		scanf("%d", &a[i]);
	}
	scanf("%d", &key);
	search(1, n);
	return 0;
}

第一次错误是:应该为 mid = (bot + top) / 2; 而我写成了 mid = (top - bot) / 2。

第二次错误是:递归条件应该是if(bot <= top); 而我写成了while(bot <= top)。当递归二分时,要用if(bot <= top);当非递归二分时,要用while(bot <= top)。


二分搜索非递归代码:

#include<stdio.h>

int key, a[20], n;

void half(void)
{
	int bot = 1, top = n, mid;  //第一次错误,忘记给bot和top赋初值
	while(bot <= top)
	{
		mid = (bot + top) / 2;
		if(key == a[mid])
		{
			printf("%d\n", mid);
			break;
		}
		else if(key < a[mid])
		{
			top = mid - 1;
		}
		else
		{
			bot = mid + 1;
		}
	}
	return;
}


int main(void)
{
	int i;
	scanf("%d", &n);
	for(i = 1; i <= n; i ++)
	{
		scanf("%d", &a[i]);
	}
	scanf("%d", &key);
	half();
	return 0;
}

第一次错误:忘记给bot和top赋初值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值