为何在降序排列的列表中使用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
相关产品推荐
相关产品推荐

