查找算法————二分查找

二分查找是一个常用的查找算法,其原理在于通过不断切分一个规则排序,对半的去寻找目标元素所在的区间与位置。但是其有一个前提,那就是数据结构需要是顺序存储结构,并且关键字大小有序排列。例子如下:

例:
有一个数列:12,23,45,56,67,89 请使用二分查找找到56的位置

解:
首先mid=(0+5)/2=2;
arr[2]位置放的是45,56大于45,所以在56,67,89之间进行查找,mid=(3+5)/2=4,arr[4]=67,这时67大于56,所以mid=(3+3)/2=3,arr[3]=56,成功找到56的位置,返回index=3

算法实现如下:

void HalfSearch(int arr[], int low, int high,int key)
{
	int count = 0;
	int count1 = 0;
	while (low<=high)
	{
		count++;
		int mid = (low + high) / 2;
		if (key > arr[mid] )
		{
			low = mid + 1;
		}
		else if ( key < arr[mid])
		{
			high = mid - 1;
		}
		else
		{
			printf_s("查找到元素%d,位置arr[%d],查找次数%d", key, mid,count);
			count1++;
			break;
		}
	}
	if (count1 == 0)
	{
		printf_s("查找失败!");
	}
}

void main()
{
	int arr[6] = { 12,23,33,66,88,99 };
	HalfSearch(arr,0,5,66);
}

二分搜索时间复杂度为:O(log2n)

因为二分查找每次去掉一半的值,所以对于n个元素的情况:

一次二分剩下:n/2
两次二分剩下:n/2/2 = n/4

m次二分剩下:n/(2^m)

在最坏情况下是在排除到只剩下最后一个值之后得到结果,即

n/(2^m)=1

所以由上式可得 : 2^m=n

故时间复杂度为: O(log2n)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值