1. 首先,我们来介绍一下二分查找的基本思想,就是对一个有序的数据,通过数组头部和尾部折半,
通过此来判断需要查找的数和mid位置数值的大小,然后判断所要查找的数字是在左边还是在在右边,
然后继续折半查找,直至找到这个数或者最后小端大于大段则结束查找。
代码示例如下:(这是正确情况下的代码)
//折半查找,找的话就返回给下标,找不到则返回-1;
int BinSearch( int *arr, int len, int key)
{
int low = 0;
int high = len - 1;
int mid;
while( low <= high)
{
mid = ( low + high) / 2;
if ( arr[mid] == key)
{
return mid;
}
else if ( arr[mid] < key) //在右边开始查找,中间值+1
{
low = mid + 1;
}
else //在左边查找,中间值-1
{
high = mid - 1;
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,5,7,9,10};
int len = sizeof(arr) / sizeof(arr[0]);
for ( int i = 0; i < len; i++)
{
printf("%d\n", BinSearch(arr, len, arr[i]));
}
return 0;
}
运行结果如下:
2.以错误情况下的代码示例来调试
int BinSearch( int *arr, int len, int key)
{
int low = 0;
int high = len -1;
int mid;
{
// <
while(low < high)
{
mid = (low + high) / 2;
if ( arr[mid] == key)
{
return mid;
}
else if ( arr[mid] < key) //在右边查找
{
low = mid + 1;
// low = mid; 错误
}
else //在左边查找
{
high = mid - 1;
// high = mid; 错误
}
}
}
return -1;
}
int main()
{
int arr[] = {1,2,3,5,7,9,10};
int len = sizeof(arr) / sizeof(arr[0]);
for ( int i = 0; i < len; i ++)
{
printf("%d\n", BinSearch(arr, len, arr[i])); // 0 1 2 3 4 5 6
}
return 0;
}
它所出来的运行结果是:-1 1 -1 3 -1 5 -1
那么我们来对该程序进行调试,记住快捷键F9是在该代码处加入断点,随着不断执行变换位置的黄色箭头是监控,开始一步步调试发现具体哪块有问题。
既然第一个输出值就有问题,那么我们把断点建立在此处。然后按调试按钮(F5为快捷键),就会看到如下界面。
最后当low == high 为0时,跳出了循环,此时我们还没有查找到关键字元素的下标(但事实上关键字存在于数组元素里面)
所以我们把 low < high 改为 low <= high。