关于c:二分搜索的陷阱

二分搜寻无处不在,然而写好一个二分搜寻却还须要规避一些陷阱。
第一篇二分搜寻论文在1946年就发表了,然而第一个没有谬误的二分搜寻程序却直到1962年才呈现。

问题:给定一个有序数组,蕴含【1…n】,以及一个目标值。搜寻目标值并返回。

int guessNumber(int n, int target){
    int left = 1, right = n, m = 0;
    while (left <= right)
    {
        m = left + (right - left)/2;
        if (m == target)
         return m;
        if(m > target)
            right = m ;
        else
            left = m ;
    }
    return m;
}

程序看起来非常简单,且对于绝大多数数据都能执行正确。
然而,如果输出是 2,2
数组内容为;[1,2],搜寻 2.
left = 1 right = 2 。 m = 1
此时会陷入死循环。

正确程序:

int guessNumber(int n, int target){
    int left = 1, right = n, m = 0;
    while (left <= right)
    {
        m = left + (right - left)/2;
        if (m == target)
         return m;
        if(m > target)
            right = m - 1;
        else
            left = m + 1;
    }
    return m;
}

举例 1…….m……..n
如果m < target 阐明target在后半局部,则新的区间应为[m+1,n],而非[m,n].
同理,如果m > target, 阐明target在前半部分,新区间应为:[1,m-1],而非[1,m].

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理