二分查找递归和非递归实现

13 篇文章 0 订阅

1、二分查找(折半查找)算法描述:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。该算法优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。

2、算法实现:

#include <iostream></span>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//递归二分查找算法 
int binarySearch(int sequenceArray[], int low, int high, int key)
{
	if(low > high)
	{
		std::cout << "sorry, can't find " << key << " in sequence Array!" << std::endl;
		return -1;
	}
	int mid = (low + high) / 2;
	if(sequenceArray[mid] == key)
	{
		std::cout << "find " << key << " in sequence Array: " << mid << " position!" << std::endl; 
		return mid;
	}
	else if(sequenceArray[mid] > key)
	{
		binarySearch(sequenceArray, low, mid - 1, key);
	}
	else
	{
		binarySearch(sequenceArray, mid + 1, high, key);
	}
}
//非递归二查查找算法 
int nonRecursionBinarySearch(int sequenceArray[], int length, int key)
{
	int low = 0; 
	int high = length - 1;
	int mid;
	while(low <= high)
	{
		mid = (low + high) / 2;
		if(sequenceArray[mid] == key)
		{
			std::cout << "find " << key << " in sequence Array: " << mid << " position!" << std::endl; 
			return mid;
		}
		else if(sequenceArray[mid] < key)
		{
			low = mid + 1;
		}
		else 
		{
			high = mid - 1;
		}
	}
	if(low > high)
	{
		std::cout << "sorry, can't find " << key << " in sequence Array!" << std::endl;
		return -1;
	}
}

int main(int argc, char *argv[]) {
	int myArray[] = {23, 34, 35, 36, 43, 46, 55, 67, 76, 88, 110}; 
	int length = sizeof(myArray) / sizeof(myArray[0]);
	//int thePosition = binarySearch(myArray, 0, length-1, 23);
	int thePosition = nonRecursionBinarySearch(myArray, length, 55);
	return 0;
}

3、算法时间复杂度为O(logn)



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值