经典算法之二分搜索技术

二分法是个非常经典的算法,是分治思想的很好的体现。在复习算法的过程中,正好把他记录下来。

本来想写递归的,后来想想还是用迭代,效率更高些,虽然对这种小的数据没什么多大影响,(好吧,其实是我太懒了 <-_->!!)

这里有个坑,以前一直没有注意,这里标记一下,调整上下限的时候一定要

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");
}

你可能感兴趣的:(c,算法,分治)