一、二分查找法(二分折半查找)
1、普通方法
/**
*@paramarr待查询数组
*@paramfindValue待查询值
*@return查询值索引
*/
private static int binaryFind(int arr[], int findValue) {
//最小索引
int lowerBound = 0;
//最大索引
int upperBound = arr.length - 1;
//中间索引
int middleIndex;
//思想:1、当最小索引小于等于最大索引时
// 2、获得middleIndex(中间索引),以此判断middleIndex对应的值和findValue(查找值)是否对等
// 3、如果对等,则返回当前索引,否则改变最小和最大索引
// 4、不对等的情况,如果当前middleIndex对应的值小于findValue,则改变最小索引为middleIndex+1,否则改变最大索引为middleIndex-1
// 5、以此循环,最终得到findValue的索引
while (lowerBound <= upperBound) {
middleIndex = (lowerBound + upperBound) / 2;
if (arr[middleIndex] == findValue) {
return middleIndex;
} else {
if (arr[middleIndex] < findValue) {
lowerBound = middleIndex + 1;
} else {
upperBound = middleIndex - 1;
}
}
}
return -1;
}
2、递归方法
/**
* 二分查找递归算法
* @param arr 待查询数组
* @param currentValue 待查询值
* @param beginIndex 起始索引
* @param endIndex 结束索引
* @return 查询值索引
*/
private static int recursionBinaryFind(int[] arr, int currentValue, int beginIndex, int endIndex) {
if (beginIndex <= endIndex) {
int middleIndex = (beginIndex + endIndex) / 2;
//当查找值等于中间值时
if (currentValue == arr[middleIndex]) {
return middleIndex;
//当查找值大于中间值时,改变起始索引和结束索引,开始递归
} else if (arr[middleIndex] < currentValue) {
return recursionBinaryFind(arr, currentValue, middleIndex + 1, endIndex);
//当查找值小于中间值时,改变起始索引和结束索引,开始递归
} else{
return recursionBinaryFind(arr, currentValue, beginIndex, middleIndex - 1);
}
} else {
return -1;
}
}