ArrayList BinarySearch

Я занят подготовкой к экзамену MCTS 70-536, согласно экзаменационной книге (Microsoft Press -.NET Framework - Application Development Foundation Self Paced Training Kit 2nd Edition), этот пример кода:

ArrayList al = new ArrayList();
al.AddRange(new string[] { "Hello", "world", "this", "is", "a", "test" });
Console.WriteLine(al.BinarySearch("this"));

Выводит значение "2" на консоль, потому что элемент 'this' находится в индексе 2. Согласен, что это результат, который я получаю, когда я запускаю этот код.

Однако, если я запустил

Console.WriteLine(al.BinarySearch("world"));

Я ожидал бы получить значение 1 в консоли, так как "world" будет в индексе 1, однако я получаю значение -7?

Может кто-нибудь объяснить, как это работает?

Спасибо

Ответ 1

Массив, в котором выполняется двоичный поиск, не сортируется. Для функции BinarySearch необходимо выполнить функцию.

Не отсортировано, смущает алгоритм поиска и заставляет думать, что "мир" должен быть на 7-м месте, но он не находится в массиве: результат равен -7.

Ответ 2

Взято непосредственно из документации MSDN ArrayList.BinarySearch(http://msdn.microsoft.com/en-us/library/5tzt7yz3%28VS.85%29.aspx)

Параметр значения и каждый элемент из массива ArrayList должны реализовать Интерфейс IComparable, который используется для сравнений. Элементы ArrayList уже должен быть отсортирован в увеличение стоимости в зависимости от вида порядок, определяемый IComparable реализация; в противном случае результат может быть неверным.

Ответ 3

Вопрос уже ответил, но добавил это для справки.

BinarySearch найдет элементы с помощью отсортированного алгоритма. В вашем примере сортировка по умолчанию является алфавитной, поэтому "мир" должен быть последним, следовательно, номер 7.

Вы увидите перегрузчик BinarySearch, который принимает объект IComparer. Чтобы не поставлять, это дает по умолчанию сортировку по алфавиту.

Но если вы внедрили метод "reverseSort" , как предлагает книга, вам нужно передать функцию BinarySearch объектом "reverseSort" .

Как это:

Console.WriteLine(al.BinarySearch(al, new reverseSort()));

И так же, как мне показалось довольно интересным, если вы реализуете класс "reverseSort" и делаете консоль .writeline, по которой сравниваются значения, результаты были не такими, как я ожидал. Я потратил немного времени, пытаясь выяснить, что такое алгоритм.

Ответ 4

Из документация:

Индекс ценности, основанный на нулевом значении отсортированный ArrayList, если значение найдено; в противном случае - отрицательное число, которое поразрядное дополнение индекса следующий элемент, который больше, чем значение или, если больше нет элемент, побитовое дополнение Граф.

Обратите внимание на отсортированное слово.