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

为何我的线性搜索方法无法返回平均值的索引?

问题分析与解决办法

让我来帮你排查这个线性搜索找不到平均值索引的问题,主要原因和修复方案如下:

核心问题:浮点数精度的坑

你遇到的最直接问题是浮点数的精确相等判断失效。看你的代码:

  • 在selectionSort里计算出的avg是sum / _arr.Length的原始结果,比如实际可能是48.03999999999999或者48.04000000000001
  • 你输出时用了Math.Round(avg, 2)显示为48.04,但传递给linearSearch的是未四舍五入的原始值
  • 数组中的值是精确的48.04,直接用==比较浮点数时,这些微小的精度差会让判断结果为false,自然找不到对应的索引

次要问题:选择排序的逻辑bug

你的selectionSort方法里有个明显的错误:if (min1 != 1)应该写成if (min1 != i)。当前的写法会导致只有当最小元素的索引不是1的时候才执行交换,这会让排序结果完全错误,可能间接影响平均值计算或者数组内容,必须先修复这个问题。


具体修复步骤

1. 修复选择排序的交换逻辑

把selectionSort中的交换条件修正:

// 原来的错误代码
// if (min1 != 1)
// 改为:
if (min1 != i)
{
    temp = _arr[i];
    _arr[i] = _arr[min1];
    _arr[min1] = temp;
}

2. 解决浮点数比较的精度问题

有两种方案可选:

方案一:用差值范围判断(推荐)

修改linearSearch中判断平均值的逻辑,判断两个浮点数的差值是否小于一个极小的阈值(比如1e-6),这样就能忽略浮点数的精度误差:

if (Math.Abs(_arr[i] - avg) < 1e-6)
{
    index3 = i;
}

方案二:统一四舍五入后再比较

如果你确定数组中的值都是保留两位小数的,可以在调用linearSearch前先把平均值四舍五入到两位小数,再传递进去:

// 在Main方法中调用linearSearch前添加
double roundedAvg = Math.Round(avg, 2);
linearSearch(arr3, max, min, roundedAvg);

3. 额外优化(可选)

如果你的数组中可能存在多个相同的平均值,当前代码会记录最后一个出现的索引。如果需要第一个出现的索引,可以找到后直接break循环:

if (Math.Abs(_arr[i] - avg) < 1e-6)
{
    index3 = i;
    break; // 找到第一个就停止搜索
}

内容的提问来源于stack exchange,提问作者nat1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 10:02:13