Во-первых, у вас есть неприятная ошибка при проверке состояния:
if (arr[mid]>key)end=mid-1;
if (arr[mid]<key)start=mid+1;
else {
Три условия должны быть взаимоисключающими. В вашей версии они не. Это должно быть:
if (arr[mid]>key)end=mid-1;
else if (arr[mid]<key)start=mid+1;
else {
Что касается возврата и подсчета дубликатов ключей, когда в вашем массиве есть повторяющиеся значения, нет никаких гарантий, что ваш двоичный поиск попадет в самый правый экземпляр. Когда вы сопоставляете ключ, вы должны сначала перемещаться вправо в массиве до тех пор, пока у вас больше не будет совпадения, а затем перейти влево к началу массива, добавляя элементы и подсчитывая совпадения ключей.
if (arr[mid]>key) end=mid-1;
else if (arr[mid]<key) start=mid+1;
else {
int right = mid+1;
while(right < arr.length && arr[right] == key)
right++;
int keyCount = 0;
for(int i=right-1; i>=0; i--) {
if(arr[i] == key) keyCount++;
ll.add(arr[i]);
}
System.out.format("Duplicates: %d%n", keyCount-1);
return ll;
}
Test:
System.out.println(BinarySearch(new int[] {1,4,6,7,8,8,8,11,30}, 8));
Вывод:
Duplicates: 2
[8, 8, 8, 7, 6, 4, 1]