今天要学习的是二分查找。
1.介绍
二分查找跟归并与快排一样都采用了分治思想,它是在一个有序数组中查找数据。
2.方法
将一个数组的下标除以2,得到的是中间数,中间数与要查找的数据进行对比(注意这里是有序数组),如果要查找的数据比中间数大就在中间数的右边,如果小就在左边。一直循环,直到找到要查找的数据或者数组查完。
3.下面看图
在图中,我要查找的是44,起初m是4,left是0,right是9
第一次:m所对应的数据小于查找的数据,那我就在右边找,这时候left是5,right不变,m是7
第二次:m所对应的数据大于查找的数据,在左边找,这个时候left还是5,right就变成了6,m是5
第三次:m所对应的数据小于查找的数据,那我就在右边找,这时候left是6,right不变,m是6,这个时候整个数组也只剩下最后一个了
第四次:m等于查找的数据,查找结束,返回下标
4.代码区
#include<stdio.h>
#include<stdlib.h>
//二分查找
int BinarySearch(int * a, int len, int FindDataName)
{
/*
参数介绍
a:传进来的有序数组
len:数组的总元素个数
FindDataNmae:需要查找的数据
*/
//1.先初始化起点
int left = 0;
int right = len - 1;
int m = (right + left) >> 1;
//2.开始折半查找
while (1)
{
if (a[m] == FindDataName) //如果a[m]==FindDataName;退出循环并且返回下标
return m;
if (left >= right) //如果数组找完了还没有找到就返回-1
return -1;
if (FindDataName > a[m]) //如果查找的数据大于中间数,就在中间数的右边找
{
//重新定义下标
left = m + 1;
m = (right + left) >> 1;
}
else//如果查找的数据小于中间数,就在中间数的左边找
{
//重新定义下标
right = m - 1;
m = (right + left) >> 1;
}
}
return -1;
}
int main()
{
int arr[10] = {11,18,22,23,25,38,44,46,52,54];
int n= BinarySearch( a, 10, 44);
printf("下标是%d",n);
return 0;
}
这是最后的打印结果
这下标所对应的数据正好是44
下面的是递归写法。
//递归型二分查找
int BinarySearch2(int * a,int left, int right, int FindDataName)
{
/*
a:传进来的数组
left:左边开始下标
right:右边结束下标
FindDataName:查找的数据
*/
int l = left;
int r = right;
int m = (left + right) >> 1;
if (FindDataName == a[m])
return m;
if (left >= right)
return -1;
if (FindDataName > a[m])
BinarySearch2(a, m + 1, right, FindDataName);
else
BinarySearch2(a, left, m-1, FindDataName);
}```
5.总结
二分查找属于经典的查找算法,重点还是要学习他的思想,对锻炼逻辑思维还是有很大帮助的。