JP2*_*P24 8 java algorithm binary-search
我一直利用大学时间通过编码算法练习Java.我编码的算法之一是二进制搜索:
public class BinarySearch {
private static int list[] = {3, 6, 7, 8, 9, 10};
public static void main(String[] args) {
BinarySearch b = new BinarySearch();
b.binarySearch(list);
}
public void binarySearch(int[] args) {
System.out.println("Binary search.");
int upperBound = args.length;
int lowerBound = 1;
int midpoint = (upperBound + lowerBound) / 2;
int difference = upperBound - lowerBound;
int search = 7;
for (int i = 0; i < args.length; i++) {
if (search < args[midpoint - 1] && difference != 1) {
upperBound = midpoint - 1;
midpoint = upperBound / 2;
} else if (search > args[midpoint - 1] && difference != 1) {
lowerBound = midpoint + 1;
midpoint = (lowerBound + upperBound) / 2;
} else if (search == args[midpoint - 1]) {
midpoint = midpoint - 1;
System.out.println("We found " + search + " at position " + midpoint + " in the list.");
i = args.length;
} else {
System.out.println("We couldn't find " + search + " in the list.");
i = args.length;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我真的希望能够编写一个更清晰,更有效的二进制搜索算法,这是我编码的替代方法.我已经看到了如何使用递归的示例,例如在使用我理解的数字进行阶乘时.然而,当编写这种复杂性的东西时,我很困惑如何使用它对我有利.因此我的问题是如何在编码二进制搜索算法时应用递归.如果你有任何提示让我完善我的递归技巧,即使它必须是不考虑二进制搜索的东西,那么请随时发布.
Cru*_*her 30
如果你真的想使用递归,这应该这样做.
public static int binarySearch(int[] a, int target) {
return binarySearch(a, 0, a.length-1, target);
}
public static int binarySearch(int[] a, int start, int end, int target) {
int middle = (start + end) / 2;
if(end < start) {
return -1;
}
if(target==a[middle]) {
return middle;
} else if(target<a[middle]) {
return binarySearch(a, start, middle - 1, target);
} else {
return binarySearch(a, middle + 1, end, target);
}
}
Run Code Online (Sandbox Code Playgroud)
这是一种更简单的二分查找方式:
public static int binarySearch(int intToSearch, int[] sortedArray) {
int lower = 0;
int upper = sortedArray.length - 1;
while (lower <= upper) {
int mid = lower + (upper - lower) / 2;
if(intToSearch < sortedArray[mid])
upper = mid - 1;
else if (intToSearch > sortedArray[mid])
lower = mid + 1;
else
return mid;
}
return -1; // Returns -1 if no match is found
}
Run Code Online (Sandbox Code Playgroud)