如何实现可处理字符串数组的二分查找算法?现有整型版代码无参考示例
字符串数组二分查找改造方案
核心改造点
- 移除原代码的整数强制校验逻辑:这段逻辑是数字搜索场景专用的,字符串搜索时完全不需要,直接取输入框的文本作为搜索目标即可,最多加个空值判断防止空输入报错。
- 替换变量与数组类型:原代码操作的整型数组
integerArray换成实际使用的字符串数组,搜索目标target的类型从整型改成字符串,直接绑定输入框的文本值。 - 替换数值大小判断为字符串专用比较:字符串没法直接用
>=做符合排序规则的大小比较,必须用string.Compare()方法返回的差值判断左右区间,而且这里用的比较规则必须和字符串数组的预排序规则完全一致,不然逻辑全错。 - 优化中间位置的计算方式:原来的
(min + max)/2在数组容量很大的时候会出现整数溢出,改成min + (max - min)/2更稳妥。
可直接运行的参考代码
以下代码中涉及的
strArray替换为你项目中实际存储待搜索内容的字符串数组变量名即可使用:
private void ButtonBinary_Click(object sender, EventArgs e) { int min = 0; int max = arraySize - 1; string target = TextBoxSearch.Text.Trim(); // 简单非空校验,避免空值搜索触发异常 if (string.IsNullOrEmpty(target)) { TextBoxMessage.Text = "请输入需要搜索的字符串内容"; return; } while (min <= max) { int mid = min + (max - min) / 2; // 此处比较规则设为不区分大小写,需和数组排序时的规则保持一致 int compareResult = string.Compare(strArray[mid], target, StringComparison.OrdinalIgnoreCase); if (compareResult == 0) { TextBoxMessage.Text = $"{target} 已找到,所在索引为 {mid}."; return; } // 中间值比目标大,搜索范围缩小到左半区 else if (compareResult > 0) { max = mid - 1; } // 中间值比目标小,搜索范围缩小到右半区 else { min = mid + 1; } } TextBoxMessage.Text = "未找到匹配内容,请重试。"; }
常见调试踩坑点
- 待搜索的字符串数组必须提前按统一规则排序:二分查找的基础要求就是搜索序列有序,比如你要做不区分大小写的搜索,那排序数组的时候也要用同样的不区分大小写规则,直接调用
Array.Sort(strArray, StringComparer.OrdinalIgnoreCase)就行,不然会出现明明数组里有目标字符串却搜不到的情况。 - 不要混用不同的字符串比较规则:如果数组是按原生字符编码排序的,就别用带文化感知的比较规则做搜索,很容易因为字母排序差异导致区间判断错位。
- 别直接给字符串用
>、<运算符:C#没给字符串定义对应的大小比较运算符,这么写直接触发编译报错。
内容的提问来源于stack exchange,提问作者LaggyAu
相关产品推荐
相关产品推荐

