5

我有一些对我来说没有多大意义的代码。我有一个字符串数组,我正在使用二进制搜索在 foreach() 循环中对它们进行计数。除了排序之外,我尝试输出的代码都完全相同。我不确定为什么我会得到我得到的结果。我认为它应该两次都以相同的方式计算数组值。有什么帮助吗?

代码:

using System;
public class Driver {
    public static void Main(string [] args) {
        String [] s = {"Bob", "Jane", "Will", "Bill", "Liz"};

        Console.WriteLine("Before Sorting:\n----------");
        foreach(string item in s) {
            Console.WriteLine("{0}. {1}", Array.BinarySearch(s, item) + 1, item);
        }
        Console.WriteLine("Will is at position {0}", Array.BinarySearch(s, "Will") + 1);

        Console.WriteLine("\n\nAfter Sorting:\n----------");
        Array.Sort(s);
        foreach(string item in s) {
            Console.WriteLine("{0}. {1}", Array.BinarySearch(s, item) + 1, item);
        }
        Console.WriteLine("Will is at position {0}", Array.BinarySearch(s, "Will") + 1);
    }
}

输出:

Before Sorting:
----------
1. Bob
2. Jane
3. Will
0. Bill
-2. Liz
Will is at position 3

After Sorting:
----------
1. Bill
2. Bob
3. Jane
4. Liz
5. Will
Will is at position 5

我敢肯定这完全是愚蠢的,但我无法弄清楚。

4

3 回答 3

5

二进制搜索仅适用于已排序的数组。它没有找到价值:

如果未找到 value 并且 value 小于数组中的一个或多个元素,则为负数,它是大于 value 的第一个元素的索引的按位补码。如果未找到 value 并且 value 大于数组中的任何元素,则为一个负数,它是 (最后一个元素的索引加 1) 的按位补码。

于 2012-10-03T17:53:31.997 回答
3

Array.BinarySearch要求对数组进行排序。从文档中:

此方法不支持搜索包含负索引的数组。在调用此方法之前必须对数组进行排序。

按照设计,它将返回负值:

如果未找到 value 并且 value 小于数组中的一个或多个元素,则为负数,它是大于 value 的第一个元素的索引的按位补码。

于 2012-10-03T17:54:21.293 回答
0

二进制搜索适用于排序数组。你的数组没有排序,所以你得到了预期的随机结果。

于 2012-10-03T17:54:36.027 回答