Использование алгоритма бинарного поиска в качестве основы для реализации двоичной вставки

99
10

Я пытаюсь реализовать двоичный метод вставки.

В настоящее время этот метод очень прост, он принимает аргумент, в цикле while он ищет элемент, который больше, чем аргумент (в данном случае строка, которая является фамилией человека), она ломается, когда она находит ее и сдвигает остальную часть массива вправо. Затем аргумент вставляется в положение нарушения.

Я попытался изменить его на тот, который будет искать позицию вставки путем заимствования из алгоритма бинарного поиска. Однако я просто не могу заставить его работать.

Не могли бы вы сообщить мне, что я делаю неправильно? Вот мой код:


public void insert(Person person)
{ String lastName = person.getLastName(); int position = -1;//the position from which the array will be shifted to the right and where the argument will be inserted, will be assigned properly below int lowerBound = 0; int upperBound = numElems - 1; int currIt; if (numElems == 0) array[0] = person;//if array empty insert at first position else { while (true) { currIt = (lowerBound + upperBound)/2;//the item to compare with int result2 = 0; int result1 = array[currIt].getLastName().compareTo(lastName); if (array[currIt+1] != null)//if the next element is not null, compare the argument to it result2 = array[currIt+1].getLastName().compareTo(lastName); if (currIt == 0 && result1 > 0)//this is when the argument is smaller then the first array element { position = 0; break; }//if the position to insert is the last one, or we have found a suitable position between a smaller and a bigger element else if ( (result1 < 0 && (currIt == numElems-1)) || (result1 < 0 && result2 > 0) ) { position = currIt+1; break; } else { if (result1 < 0)//the place to put it should be in the upper half lowerBound = currIt + 1; else upperBound = currIt - 1;//in the lower half } } }//position has been set to anything else other -1, then we have found our spot, probably a redundant check but useful for debugging if (position != -1) {//shift array to the right and insert element for (int j = numElems; j > position; j--) array[j] = array[j-1]; System.out.println("Inserted an element"); array[position] = person; numElems++; } }

спросил(а) 2021-01-28T00:13:43+03:00 4 месяца, 3 недели назад
1
Решение
63

Ваша "вероятно [] избыточная проверка" запрещает первоначальную вставку. Позиция - -1 в первый раз.

Установка position на 0 в верхней части должна устранить проблему.

ответил(а) 2021-01-28T00:13:43+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема