4-用调试的方法改正下列代码(折半查找)

源代码(错误代码)

int main()
{
	int arr[] = {1,3,6,7,10,13,16,20,30,32};
	int key = 16;
	//int key = 17;//bug
	//int key = 2;//bug
	//int key = 32;//bug
	int low = 0;
	int high = sizeof(arr)/sizeof(arr[0]) - 1;
	int mid;
	while(low < high)
	{
		mid = (low+high)/2;
		if(arr[mid] == key)//
		{
			printf("找到了,在%d下标\n",mid);
			return 0;
		}
		else if(arr[mid] < key)//在右边找
		{
			low = mid;
		}
		else//在左边找
		{
			high = mid;
		}
	}
	printf("没有找到\n");
	return 0;
}

当key=2,key=17,key=32时,结果都不正确,要求改正

①第一次调试(key=17)(key=2):

在这里插入图片描述
当进行到4步以后,发现进入了无限循环模式,而在每一次比较中,如果arr[mid]的值比key值大,则应该high=mid-1,而不是high=mid,如果arr[mid]的值比key值小,则应该low=mid+1,而不是low=mid,这是因为比较以后,key的值都不等于low或者high,所以应该排除这两个数,避免重复比较,出现BUG。

改正后运行结果正确:

key=17;

在这里插入图片描述

key=2;

在这里插入图片描述

②第二次调试(key=32):

在这里插入图片描述
程序结束,因为第四步开始时,low不小于high所以程序结束了,但是我们希望low=high,所以应该是low<=high。

改正后运行结果正确:

key=32;

在这里插入图片描述

源代码(正确代码):

int main()
{
	int arr[] = {1,3,6,7,10,13,16,20,30,32};
	int key = 16;
	//int key = 17;//bug
	//int key = 2;//bug
	//int key = 32;//bug
	int low = 0;
	int high = sizeof(arr)/sizeof(arr[0]) - 1;
	int mid;
	while(low <= high)//调试改错点
	{
		mid = (low+high)/2;
		if(arr[mid] == key)//
		{
			printf("找到了,在%d下标\n",mid);
			return 0;
		}
		else if(arr[mid] < key)//在右边找
		{
			low = mid+1;//调试改错点
		}
		else//在左边找
		{
			high = mid-1;//调试改错点
		}
	}
	printf("没有找到\n");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值