Array.BinarySearch не находит элемент, используя IComparable - PullRequest
0 голосов
/ 29 мая 2010

Если для бинарного поиска требуется, чтобы массив был отсортирован заранее, почему работает следующий код?

string[] strings = new[] { "z", "a", "y", "e", "v", "u" };
int pos = Array.BinarySearch(strings, "Y", StringComparer.OrdinalIgnoreCase);           
Console.WriteLine(pos);

И почему этот код возвращает -1?

 public class Person : IComparable<Person> {

    public string Name { get; set; }
    public int Age { get; set; }


    public int CompareTo(Person other) {
        return this.Age.CompareTo(other.Age) + this.Name.CompareTo(other.Name);
    }
}
var people = new[] {

                new Person { Age=5,Name="Tom"},
                new Person { Age=1,Name="Tom"},
                new Person { Age=2,Name="Tom"},
                new Person { Age=1,Name="John"},
                new Person { Age=1,Name="Bob"},
            };


            var s = new Person { Age = 1, Name = "Tom" };

            // returns -1
            Console.WriteLine(
                Array.BinarySearch(people, s)
            );

1 Ответ

2 голосов
/ 29 мая 2010

Если вы нарушите предварительное условие («Элементы массива уже должны быть отсортированы по возрастанию в соответствии с порядком сортировки, определенным компаратором; в противном случае результат может быть неправильным.») вызвать неопределенное поведение, которое иногда включает в себя «Эй, похоже, это сработало». То же самое относится и к использованию после свободных и многих других ошибок программирования.

Я не удивлен, что это работает для этого ввода, потому что "y" и "e" оба одинаково средние элементы. Он использует нижнюю середину, "у", которая соответствует. Если вы попробуете:

string[] strings = new[] { "z", "a", "y", "e", "e", "v", "u" };

вы увидите, что это не работает. Обратите внимание, что существует нечетное количество элементов. Цель находится перед серединой, а должна быть после.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...