什么是折半查找呢?通俗来说,折半查找即取有序数组的中间值与所查找的数字相比较,逐步锁定目标数字的一种方法。对于计算机来说,折半查找效率比逐个比较高的多。假设一个有序数组有1024个数,那么折半查找最多查找10次即可找到所求数字(次数=以2为底n的对数)。
即:假设有一组有序数组{ 1,2,3,4,5,6,7,8,9,10 }
现需要查找数字4所在位置
那么我们先取数字1与10的所在位置求平均值即下标0与9
(0+9)/2 得到的是4,下标为4的数是数字5,经比较,4<5,那么5之后的数字就完全不用再考虑了
现在重新求数字1与5的下标的平均值即(0+4)/2得到的是2,同理,经比较,3<4,即3之前的数字完全不需要考虑了。现求数字3与5的下标的平均值即(2+4)/2得到的是3,下标为3的数字即为所求数字,打印其下标3即可。
那么如何用代码实现呢:
#include<stdio.h>
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9 };
int k = 4;
int n = sizeof(arr)/sizeof(arr[0]);
int left = 0;
int right = n - 1;
while(left <= right)
{
int mid = ( left + right )/2 ;
if (arr[mid]<k)
{
left = mid + 1;
}else if (arr[mid]>k)
{
right = mid - 1;
}else
{
printf("找到了%d\n",mid);
break;
}
}
//考虑意外情况,防止范围重合
if( left > right )
{
printf("寄");
}
}
以上代码仅供辅助理解,具体实操还需各位看官自行动手尝试。