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

如何实现可处理字符串数组的二分查找算法?现有整型版代码无参考示例

字符串数组二分查找改造方案

核心改造点

  • 移除原代码的整数强制校验逻辑:这段逻辑是数字搜索场景专用的,字符串搜索时完全不需要,直接取输入框的文本作为搜索目标即可,最多加个空值判断防止空输入报错。
  • 替换变量与数组类型:原代码操作的整型数组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 06:45:04