·什么是折半查找
·当我们在一堆有序数组中间查找一个数的时候,先将中间的数与查找数进行比较。如果中间数大于我们要查找的数,则在中间左半边进行查找;同样的,如果中间数小于我们要查找的数,则在中间往右半边再次进行查找。重复以上的过程,直到满足,如果不满足,则查找失败。
·条件:元素必须按照大小有序排列。
·图示
·那我们实现的思路是什么呢?我们定义三个变量,分别指向这个数组的最左边以及最右边还有中间,将中间的数与查找数进行比较。根据情况缩减范围,即改变左边或者右边变量的值,再次进行比较。过程如下图所示:
·函数实现
int find(int arr[], int a, int left, int right)
{
while(left<=right)
{
int mid = left+(right-left)/2;
if(arr[mid] == a)
{
return mid;
}
else if(arr[mid]>a)
{
right = mid-1;
}
else
{
left = mid+1;
}
}
return -1;
}
·当缩减范围的时候并不是把mid的值赋给left或者right,因为mid已经比较过了,所以我们把mid进行--或者++处理。
·我们函数返回的int值即为所要查找的数在数组中的位置