使用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
相关产品推荐
相关产品推荐

