C#二进制搜索返回负索引

时间:2016-12-05 11:15:32

标签: c# arrays

今天,我已经围绕二元搜索。我听说这是在大数组中查找索引的最快方法。因此,我决定编写代码,以便在没有我正在搜索的索引的情况下查看是否会出现异常。

int[] longArray = new int[1000];
Random rnd = new Random();

for (int i = 0; i < longArray.Length; i++)
{
    longArray[i] = rnd.Next(1, 1000);
}

Array.Sort(longArray);            

int indexOfMyNum = Array.BinarySearch(longArray, 706);
Console.WriteLine("Here it is: " +  indexOfMyNum);

现在这个有趣的部分,没有例外,我的程序总是返回一个负数的数字。我知道随机查看这种行为并不是必需的,但我想在较大的阵列上测试它。现在我的问题是,为什么我得到负面索引而不是异常。如果我错了,请纠正我,因为数组的索引与内存地址直接相关,这是否意味着BinarySearch正在查看他不应该被允许的内存,看看我的号码是否存在?

有人知道为什么会发生而不是例外吗?

1 个答案:

答案 0 :(得分:4)

Method documentation解释了“神秘”:

  

返回值

     

输入:System.Int32

     

指定数组中指定值的索引(如果找到值);否则,为负数。如果未找到值且值小于数组中的一个或多个元素,则返回的负数是第一个元素的索引的按位补码,其大于值。如果未找到值且值大于数组中的所有元素,则返回的负数是(最后一个元素的索引加1)的按位补码。如果使用非排序数组调用此方法,则返回值可能不正确,并且可能返回负数,即使数组中存在值也是如此。 (重点补充)

这意味着您的程序正在搜索数组中不存在的值,并获得插入位置的按位补码,即负数。

  

有人知道为什么会发生而不是例外吗?

非常直率地说,这是因为没有在集合中找到一个项目并不是特例。毕竟,我们经常只是寻找一个项目,看它是否存在。 BinarySearch方法返回一个负数符合此要求,因为调用者可以告知该项是否存在,如果不存在,那么插入的位置是什么:

int indexOfMyNum = Array.BinarySearch(longArray, 706);
if (indexOfMyNum < 0) {
    int insertionPos = ~indexOfMyNum;
    Console.WriteLine("The number is not there; insert at {0}", insertionPos);
}