折半查找法的应用。

写代码可以在整型有序数组中查找想要的数字, 找到了返回下标,找不到返回-1。

具体思路我写一下。


1.首先我们我们要查找一个数组元素所对应的下标,我们可以一个一个去比对,但是这样明显费时费力,这样我们就引入了折半查找的方法。

  • 折半查找(在计算机科学中,二分搜索(英语:binary search),用于对数搜索,还有是一种在有序数组中查找某一特定元素的搜索算法。搜索过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜索过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。)。

2.如果要进行折半查找,那我们就要找到一个数组的最左边和最右边下标,最左边下标当然是0,那么最右边的是什么?其实就是数组元素的个数减一。如果不知道数组元素具体个数,那我们就可以用
int len = sizeof(arr) / sizeof(arr[0])来求得,再减一就是最右边下标。


3.那么中间元素对应的下标就是mid=(left+right)/2 然后mid对应的元素与要查找的值对比,若比要查找的值大,那么就将right变为mid-1,这样查找的范围缩小一半,若小于,则将left变为mid+1,依次下去,直到找到为止,这样大大加快了速度。


下面则是具体实现代码。

#include<stdio.h>
#include<stdlib.h>
int BinarySearch(int arr[], int left, int right, int key)
{
	while (left <= right)         //进行一个循环。
	{
		int mid = (right + left) / 2;     //折半后的元素为最左边的元素,与最右边的元素相加除2.
		if (arr[mid] > key)           //将数组中间元素对应的值与要比较的值相比较。  
		{
			right = mid - 1;       //若大于,则猜大了,将mid-1赋值给right。
		}
		 else if (arr[mid] < key)
		{
			left = mid + 1;           //若小于,将mid+1赋值给left。
		}
		 else
	    {
			return mid;           //若想等返回mid,即猜中了。
		}
	} 
	return -1;                   //若都没有,返回-1。
}
int main()
{
	int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int len = sizeof(arr) / sizeof(arr[0]);             //求数组的长度。
	int index = BinarySearch(arr, 0, len - 1, 6);       //调用 BinarySearch函数。
	printf("%d\n", index);
	system("pause");
	return 0;
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值