简单的二分法查找说明

简述

分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:

  1. 确定该区间的中间位置K
  2. 将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。
  3. 每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。

即每次将范围缩小一半,即可,能够大大提高算法的效率。但是前提是数组中的数是排列好的。

练习

目标:将一个将0-9按从小到大排列的数组中查找一个0-9的随机值,输出其下标

代码如下:


//2分法查询数据
#include <stdio.h>
int main()
{	
	//先定义目标数组
	int arr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	//给定一个0-9的随机数
	int n = srand(time(0)) % 10;
	printf("%d\n", n);
	//下面开始写业务逻辑
	int left = 0;
	int right = sizeof(arr) / sizeof(int);
	//
	int mid;
	while (left < right)
	{
		mid = (left + right) / 2;
		if (arr[mid] < n)
		{
			left = mid - 1;
		}
		else if (arr[mid] > n)
		{
			right = mid+1;
		}
		else
		{
			printf("找到这个数了,这个数为:%d\n", arr[mid]);
			printf("其下标为:%d\n",mid);
			break;
		}
	}
	return 0;
}

总结

思路其实很简单,就是将一个排列好的数组每次进行查询,并将范围缩小一半,直到确定出具体值为止。但实际操作中,会有很多的问题,比如数组的个数是奇数和偶数的情况,在实例代码中,我仅仅针对当前特例进行处理,后续的学习当中,应当做到:

  1. 用户自己输入数组
  2. 将数组中的元素进行排列
  3. 针对数组元素的奇偶性进行分类讨论
  4. 捋直思路,简化代码,或者找到更高效简单的算法
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

友人和他的朋友们

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值