二分法是个非常经典的算法,是分治思想的很好的体现。在复习算法的过程中,正好把他记录下来。
本来想写递归的,后来想想还是用迭代,效率更高些,虽然对这种小的数据没什么多大影响,(好吧,其实是我太懒了 <-_->!!)
这里有个坑,以前一直没有注意,这里标记一下,调整上下限的时候一定要
low = mid + 1; high = mid - 1; 否则可能遇到相邻的两个数字时候,陷入死循环!!!
代码如下:
// =====================【二分搜索技术 】==================
// @ author : zhyh2010
// @ date : 20150606
// @ version : 1.0
// @ description :
// =====================【二分搜索技术】==================
#include <stdio.h>
#include <stdlib.h>
#define NUM 100
int target_arr[NUM] = { 0 };
void init()
{
for (int i = 0; i != NUM; i++)
target_arr[i] = i;
}
int BinarySearch(int low, int high, int target)
{
printf("target is %d\n", target);
while (true)
{
int mid = (low + high) / 2;
printf("low = %2d\thigh = %2d\tmid = %2d\n",
target_arr[low], target_arr[high], target_arr[mid]);
if (target == target_arr[mid])
return mid;
if (low == high)
return -1;
if (target_arr[mid] > target)
high = mid - 1;
else
low = mid + 1;
}
}
void main()
{
init();
int id = BinarySearch(0, NUM - 1, 500);
if (id > 0)
printf("find it\n");
else
printf("not find\n");
}
时间: 2024-10-09 08:43:38