You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用compare()函数处理字符串的二分查找死循环问题

使用compare()函数处理字符串的二分查找死循环问题

嗨,你的二分查找死循环问题其实是个很容易忽略的小bug——最后一个分支的指针更新逻辑写错啦!咱们来一步步理清楚:

首先先确认你对string::compare()的理解是对的:

  • 当topMovies[middle].title.compare(title) > 0:说明中间位置的电影标题字典序大于目标标题,此时目标应该在左半区间,你把last = middle - 1是完全正确的。
  • 当compare返回小于0时:说明中间标题字典序小于目标标题,这时候目标应该在右半区间,你需要把first更新为middle + 1,但你现在写的是first = middle - 1——这直接把搜索范围往反方向缩小了,导致搜索区间根本无法收敛,最终陷入无限循环。

给你修正后的findMovieTitle函数:

int findMovieTitle(const Movies topMovies[], const int SIZE, string title) {
    int first = 0;
    int last = SIZE - 1;
    int middle;
    int pos = -1;
    bool found = false;
    
    while (!found && first <= last) {
        middle = (first + last) / 2;
        
        if(topMovies[middle].title == title) {
            pos = middle;
            found = true;
        } else if (topMovies[middle].title.compare(title) > 0) {
            // 中间标题更大,目标在左半区
            last = middle - 1;
        } else {
            // 中间标题更小,目标在右半区,正确更新first的位置
            first = middle + 1;
        }
    }
    
    return pos;
}

另外还要特别提醒你一个二分查找的核心前提:你的MovieArray必须已经按照电影标题的字典序从小到大排好序了!如果数组本身是无序的,哪怕逻辑修好了,也可能找不到正确结果,甚至出现其他奇怪问题哦。

备注:内容来源于stack exchange,提问作者Israel Villegas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:42:58