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

为何在降序排列的列表中使用BinarySearch查找元素会返回负数?

为什么降序列表用BinarySearch会返回负数?

哈哈,这个坑我之前刚踩过!让我给你掰扯清楚:

首先,先理清楚你的代码执行后列表的状态:

  • 初始列表:[4,1,5,2,3]
  • 调用list.Sort()后变成升序:[1,2,3,4,5]
  • 再list.Reverse()就成了降序:[5,4,3,2,1]

问题就出在BinarySearch的默认行为上:.NET的List<T>.BinarySearch()方法默认假设你的列表是按升序排列的,它用的是默认的升序比较器(Comparer<int>.Default)。当你的列表实际是降序时,搜索算法的逻辑和列表的顺序完全不匹配,哪怕元素明明在列表里,它也找不到,只会返回一个负数。

举个简单的例子:默认的BinarySearch会觉得“如果目标元素比中间元素大,就去右半部分找”,但你的降序列表里,大的元素都在左边,所以它越找越偏,最后就返回“未找到”的负数结果了。

解决办法很简单:给BinarySearch指定降序比较器

你只需要用BinarySearch的重载版本,传入一个符合列表顺序的比较器就行:

var elementIndex = list.BinarySearch(5, Comparer<int>.Create((a, b) => b.CompareTo(a)));

这里的比较器(a,b) => b.CompareTo(a)会告诉BinarySearch:我们的列表是降序的,要按照“b比a大则排前面”的逻辑来搜索,这样就能正确找到元素5的索引0了。

另外还有个小细节:BinarySearch返回的负数其实是-(插入点) -1,但因为你的列表顺序和默认比较器不匹配,这个插入点完全没有参考价值,不用管它~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:06:21