简述
分法查找适用于数据量较大时,但是数据需要先排好顺序。主要思想是:
- 确定该区间的中间位置K
- 将查找的值T与array[k]比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续二分查找。
- 每一次查找与中间值比较,可以确定是否查找成功,不成功当前查找区间将缩小一半,递归查找即可。
即每次将范围缩小一半,即可,能够大大提高算法的效率。但是前提是数组中的数是排列好的。
练习
目标:将一个将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;
}
总结
思路其实很简单,就是将一个排列好的数组每次进行查询,并将范围缩小一半,直到确定出具体值为止。但实际操作中,会有很多的问题,比如数组的个数是奇数和偶数的情况,在实例代码中,我仅仅针对当前特例进行处理,后续的学习当中,应当做到:
- 用户自己输入数组
- 将数组中的元素进行排列
- 针对数组元素的奇偶性进行分类讨论
- 捋直思路,简化代码,或者找到更高效简单的算法