【二分查找要求】:1.必须采用顺序存储结构 2.必须按关键字大小有序排列。
package com.winstone.test.binary;
/**
* 二分查找
*
* @author winstone
*
*/
public class BinarySearch {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] srcArray = new int[] { 1, 3, 5, 8, 9, 22 };
int des = 9;
System.out.println(binarySearch(srcArray, des));
System.out.println(binarySearch(srcArray, 3, 0, srcArray.length - 1));
}
/**
* 循环查找
*
* @param srcArray
* 源数组
* @param des
* 查找数
* @return 返回scrArray的下标,没有则为-1
*/
public static int binarySearch(int[] srcArray, int des) {
int start = 0; // 开始查找数组的起点
int end = srcArray.length - 1; // 查找的终点
while (start <= end) {
int middle = (start + end) / 2;
if (des == srcArray[middle]) {
return middle;
} else if (des < srcArray[middle]) {
end = middle - 1;
} else {
start = middle + 1;
}
}
return -1;
}
/**
* 递归查找
*
* @param dataArray
* 源数组
* @param des
* 查找数
* @param startIndex
* 开始下标
* @param endIndex
* 结束下标
* @return 返回查找的的数组下标,没有则返回-1
*/
public static int binarySearch(int[] dataArray, int des, int startIndex,
int endIndex) {
int middle = (startIndex + endIndex) / 2;
if (des < dataArray[startIndex] || des > dataArray[endIndex]
|| startIndex > endIndex) {
return -1;
} else if (des < dataArray[middle]) {
return binarySearch(dataArray, des, startIndex, middle - 1);
} else if (des > dataArray[middle]) {
return binarySearch(dataArray, des, middle + 1, endIndex);
} else {
return middle;
}
}
}