《算法导论》P39课后题
2.3.5 二分搜索问题
方案一:参考:java Arrays.binarySearch的源码
public static int binarySearch(char[] array, int startIndex, int endIndex, char value) {
checkBinarySearchBounds(startIndex, endIndex, array.length);
int lo = startIndex;
int hi = endIndex - 1;
while (lo <= hi) {
int mid = (lo + hi) >>> 1;
char midVal = array[mid];
if (midVal < value) {
lo = mid + 1;
} else if (midVal > value) {
hi = mid - 1;
} else {
return mid; // value found
}
}
return ~lo; // value not present
}
private static void checkBinarySearchBounds(int startIndex, int endIndex, int length) {
if (startIndex > endIndex) {
throw new IllegalArgumentException();
}
if (startIndex < 0 || endIndex > length) {
throw new ArrayIndexOutOfBoundsException();
}
}
据此编写的BinarySearch的代码如下:
public class IfExistTwoNumbers {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] data={0,3,5,7,9,11,17,1000};
System.out.println(binarySearch(data, 0, data.length-1, 17));
}
/*二分搜索返int value在int[] data中的位置*/
public static int binarySearch(int[] data,int start,int end,int value) {
if (start>end) {
throw new IllegalArgumentException();
}
int low=start;
int high=end;
while (low<=high) {
int middle=(low+high)>>>1;
int key=data[middle];
if (key<value) {
low=middle+1;
}else if (key>value) {
high=middle-1;
}else {
return middle;
}
}
return ~low;
}
}
方案二:递归的方案
参考:http://blog.youkuaiyun.com/androiddevelop/article/details/17883125
public class BinarySearch {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成的方法存根
int[] data={0,3,5,7,9,11,17,1000};
System.out.println(MyBinarySearch(data, 0, data.length-1, 17));
}
/*二分搜索,递归方法*/
public static int MyBinarySearch(int[] data,int start,int end,int value) {
if (start>end) {
return -1;
}
int middle=(start+end)/2;
if (data[middle]<value) {
return MyBinarySearch(data, middle+1, end, value);
}else if (data[middle]>value) {
return MyBinarySearch(data, start, middle-1, value);
}else {
return middle;
}
}
}
BinarySearch的 时间复杂度为lg
n 。