1
public int BinarySearch(int x)
{
    //if (Attendees.Length == 0)
    //    return -1;
    int mid =  (Count/ 2) -1;
    Student cur = new Student(x);

    while (cur.CompareTo(Attendees[mid]) != 0)
    {
        int sCount = Count;
        if (cur.CompareTo(Attendees[mid]) < 0)
        {
            int NCount = sCount / 2;
            mid = NCount / 2 - 1;    
        }
        if (cur.CompareTo(Attendees[mid]) > 0)
        {
            int Start = mid +1;
            mid = (Start + sCount) / 2;
        }
        else
            break;

        cur = Attendees[mid];                
    }
    if (cur.CompareTo(Attendees[x]) == 0)
        return mid;
    else 
        return -1;
}

誰かが私のバイナリ検索が機能しない理由を見つけるのを手伝ってもらえますか?私はプログラミングにとても慣れていないので、どんな助けでも大歓迎です。ありがとうございました。

4

1 に答える 1

3

二分探索とは何かをよく理解していなかったと思います。あなたのコードでは、要素xが配列内のどの位置にあるかを検索しています - 何を推測しますか? 位置にありxます!

二分探索とは、要素のインデックスを見つけることです。与えられたものを検索する必要がありますStudent:

public int BinarySearch(Student student)
{
    // Search the entire range
    int min = 0;
    int max = Attendees.Length;
    int mid = 0;

    do
    {
        // Find the pivot element
        mid = min + ((max - min) / 2);

        // Compare
        int comparison = student.CompareTo(Attendees[mid]);
        if (comparison < 0)
        {
            max = mid;
        }
        if (comparison > 0)
        {
            min = mid;
        }
    }
    while (min < max && comparison != 0);

    if (comparison != 0)
        return -1;
    return mid;
}

このコードは、私が試したわけではなく、頭から書き留めたものではないため、100% 機能しない可能性がありますが、正しい方向に向けることができます。次に、このコードに対してデバッガーを使用し、シングル ステップで実行して、期待どおりに動作するかどうかを確認します。

于 2013-02-07T09:16:14.567 に答える