Binary search с Java
Здравейте, някой би ли погледнал къде греша? Това е задачата: Да се реализира двоично търсене (binary search) в сортиран целочислен масив.
public class BinarySearch {
public static int[] array = {2,3,6,7,9,10,11,14};
public static void main(String[] args) {
int value = 6;
int position = binarySearch(value, 0, array.length-1 );
if (position == -1) {
System.out.println("Element is not found.");
} else {
System.out.printf("The position of element is: %d.", position);
}
}
public static int binarySearch(int element, int left, int right) {
int l = left;
int r = right;
int m = l + (r-l)/2;
while (l <= r) {
if (element == array[m]) {
return m;
} else if (element > array[m]) {
r = m-1;
} else {
l = m+1;
}
return -1;
}
}
}
Благодаря за включването, знакът наистина е обърнат, но на това return място не можах да намеря. Не тръгва и това е.
return -1; трябва да е извън scope-a на while цикъла. Пробвай така:
http://pastebin.com/e0XzvBKu
Също, част от идеята на binary search-a, е да можеш лесно да вкарваш елементи на коректните им места в списъка или иначе казано, да можеш да ползваш двойчно търсене, заедно с двойчно insert-ване, за да поддържаш една колекция подредена, а не да трябва да я сортираш отделно. За целта, когато binary search-a не намери търсения елемент, трябва да връща не -1, а индекса, където елемента би трябвало да стои, ако го имаше. Можеш да направиш следното - вместо return -1, да правиш return -(l + 1). Идеята е, че ако елемента го няма в колекцията, то евентуалното му място, ще е "l", само че, ако l == 0, няма как да провериш дали елемента е намерен или не :). За това, увеличаваш l с единица и връщаш резултата с - отпред. Там, където проверяваш резултата от търсенето, можеш да имаш нещо подобно - if (index < 0) {collection.insert(-(index + 1), element)} или иначе казано, ако получиш резултат -1, то ще знаеш, че елемента го няма в колекцията, но ако го имаше, то той щеше да е на позиция 0. Ако получиш -3, то по същата логика, елемента би бил на позиция 2.
Дано не съм те объркал още повече :D.
Мерси, пробвах и така, но не тръгва. Определено мястото на return не е в while цикъла, но този път компилаторът хем не ми изписва грешка, хем програмата не спира да работи, а резултат никакъв не се изписва на конзолата.