源代码(错误代码)
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;
}