数据结构基础(10)------------二分查找算法(BinarySearch)

 数据结构基础(10)————二分查找算法(BinarySearch)
1.二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;
其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。
2.代码实现

enum status
{
	invalid=0,valid
};
int g_satus=valid;
//在数组a中查找,记录,若返回是零值,则必须检测全局变量g_status来判断,返回的值是正确的还是错误的
int binary_search(int *a,int n,int key) 
{
	g_satus=invalid;
	if (nullptr==a || n<0)   //若为空,或没有元素,则出错
	{
		return 0;
	}
	int low=0;        //定义此下标为当前最小值的下标
	int high=n-1;     //定义此下标为当前最大值的下标
	int mid=0;
	while(low<=high)
	{
		//当前查找区间R[low..high]非空
		mid=low+((high-low)/2);
			//使用 (low + high) / 2 会有整数溢出的问题
			//(问题会出现在当low + high的结果大于表达式结果类型所能表示的最大值时,
			//这样,产生溢出后再/2是不会产生正确结果的,而low+((high-low)/2)不存在这个问题
		if (key>a[mid])
		{
		    low=mid+1;
		}
		else if (key<a[mid])
		{
			high=mid-1;
		}
		else
		{
			g_satus=valid;
			return mid;
		}
	}
	return 0;
}


    原文作者:查找算法
    原文地址: https://blog.csdn.net/wolangjushi/article/details/22666467
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞