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

二分探索は、ソートされた配列でのみ機能します。値が見つかりません:

値が見つからず、値が配列内の1つ以上の要素よりも小さい場合、値よりも大きい最初の要素のインデックスのビット単位の補数である負の数。値が見つからず、値が配列内のどの要素よりも大きい場合は、(最後の要素のインデックスに1を加えたもの)のビット単位の補数である負の数。

于 2012-10-03T17:53:31.997 に答える
3

Array.BinarySearchでは、配列を並べ替える必要があります。ドキュメントから:

このメソッドは、負のインデックスを含む配列の検索をサポートしていません。このメソッドを呼び出す前に、配列をソートする必要があります。

設計上、負の値を返します。

値が見つからず、値が配列内の1つ以上の要素よりも小さい場合、値よりも大きい最初の要素のインデックスのビット単位の補数である負の数。

于 2012-10-03T17:54:21.293 に答える
0

二分探索は、ソートされた配列で機能します。配列はソートされていないため、期待どおりにランダムな結果が得られます。

于 2012-10-03T17:54:36.027 に答える