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

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

例:
有一个数列: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)

原创文章 24 获赞 2 访问量 922

猜你喜欢

转载自blog.csdn.net/weixin_43653187/article/details/104809192