【6】以二分法(折半查找)示例——VS2012的调试过程(快捷键等使用)

   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。


猜你喜欢

转载自blog.csdn.net/Murphy5222/article/details/81047426