分享一个大牛的人工智能教程。零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击人工智能教程
package peace.learn.java.algorithm.search;
/**
* @author Peace
* Prerequisite:
* The prerequisite of binary search:
* 1. The searched sequence must be sequentially stored.
* 2. The searched sequence must be sorted by keyword.
*/
public class BinarySearch {
/**
* Recursively binary search x in sorted array a
* with low as subscript lower bound and high as subscript upper bound.
* Its time complexity is O(log2n).
*
* @param a The array to be searched
* @param x The searched target
* @param low The subscript lower bound of array a
* @param high The subscript upper bound of array a
* @return The subscript of x in the array a if found, -1 otherwise.
*/
public static int searchRecursively(int[] a, int x, int low, int high) {
if (a == null || a.length == 0) {
return -1;
}
// Not found
if (low > high) {
return -1;
}
int mid = (low + high) >>> 1;
if (a[mid] == x) {
return mid;
} else if (a[mid] > x) {
return searchRecursively(a, x, low, mid - 1);
} else {
return searchRecursively(a, x, mid + 1, high);
}
}
/**
* Circularly binary search x in sorted array a.
* Its time complexity is O(log2n).
*
* @param a The array to be searched
* @param x The searched target
* @return The subscript of x in the array a if found, -1 otherwise.
*/
public static int searchCircularly(int[] a, int x) {
if (a == null || a.length == 0) {
return -1;
}
int low = 0;
int high = a.length - 1;
while (low <= high) {
int mid = (low + high) >>> 1;
if (a[mid] == x) {
return mid;
} else if (a[mid] > x) {
high = mid - 1;
} else {
low = mid + 1;
}
}
return -1;
}
/**
* Test program
*
* @param args The arguments
*/
public static void main(String[] args) {
int[] a1 = {-3, -1, 0, 6, 11, 16, 16, 22, 99, 99};
System.out.println(String.format("Search %d recursively in array a1 with result subscript: %d",
16, searchRecursively(a1, 16, 0, a1.length - 1)));
System.out.println(String.format("Search %d circularly in array a1 with result subscript: %d",
16, searchCircularly(a1, 16)));
int[] a2 = {};
System.out.println(String.format("Search %d recursively in array a2 with result subscript: %d",
16, searchRecursively(a2, 16, 0, a2.length - 1)));
System.out.println(String.format("Search %d circularly in array a2 with result subscript: %d",
16, searchCircularly(a2, 16)));
int[] a3 = null;
System.out.println(String.format("Search %d recursively in array a3 with result subscript: %d",
16, searchRecursively(a3, 16, 0, 0 - 1)));
System.out.println(String.format("Search %d circularly in array a3 with result subscript: %d",
16, searchCircularly(a3, 16)));
}
}
/* ------ Running Result ------
Search 16 recursively in array a1 with result subscript: 5
Search 16 circularly in array a1 with result subscript: 5
Search 16 recursively in array a2 with result subscript: -1
Search 16 circularly in array a2 with result subscript: -1
Search 16 recursively in array a3 with result subscript: -1
Search 16 circularly in array a3 with result subscript: -1
*/