首页 > 学院 > 开发设计 > 正文

二分查找

2019-11-06 06:31:15
字体:
来源:转载
供稿:网友
/*R[low..high]二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。n/2^k=1,得得k=log2n,时间复杂度可以表示O(logn)*/#include <stdio.h>  //-------------------递归方法----------------------------- int bin_search_recursion1(int array[], int low, int high, int key)  /*传入参数分别是找到的数组Array,数组起始位置,数组结束位置,要找的数*/{	if (low <= high)	{		int mid = low + (high - low) / 2;		if (key == array[mid])			return mid;		else if (key<array[mid])			return bin_search_recursion1(array, low, mid - 1, key);		else if (key>array[mid])			return bin_search_recursion1(array, mid + 1, high, key);	}	else		return -1;}int bin_search_recursion(int array[], int len, int key){	//如果传入的数组为空或者数组长度<=0那么就返回-1。防御性编程  	if (array == NULL || len <= 0)		return -1;	return bin_search_recursion1(array, 0, len - 1, key);}//--------------------------非递归方法------------------------ int bin_search(int array[], int len, int key)  /*传入参数分别是数组地址Array,数组长度len,要找的数据key  返回值为key的位置*/{	//防御性编程  	if (array == NULL || len <= 0)		return -1;	int low = 0, high = len - 1;	int mid;	while (low <= high)	{		mid = low + (high - low) / 2;//为了防止整型变量溢出,用mid=(low+high)/2,low+high可能会大于表达式结果类型所能表示的最大值  		if (key == array[mid])			return mid;		else if (key<array[mid])			high = mid - 1;		else			low = mid + 1;	}	return -1;}int main(void){	int a[6] = { 0,5,20,30,88.102 };	int len = sizeof(a) / sizeof(a[0]);	int locate = 0, locrec = 0;	locate = bin_search(a, len, 88);	locrec = bin_search_recursion(a, len, 20);//根据参数个数选择执行的函数  	PRintf("%d/n", locate);	printf("%d/n", locrec);	return 0;}
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表