二分法查找
特征:
1. 要求查询的数组必须是一个经过排序之后的数组
2. 多个指定数据的情况下,无法告知到底是第几个数据出现
3. 没有找到数据返回负数
演示:
1 3 5 7 9 11 13 15 17 19
例如:
查询元素 13的下标位置
第一步:
中间下标元素是 下标为4 元素值=9
最小下标为0
最大下标为9
9 < 13
需要修改最小下标 ==> 中间下标 + 1 ==> 5
第二步:
中间下标元素是 下标为7 元素值=15
最小下标为5
最大下标为9
15 > 13
需要修改最大下标 ==> 中间下标 - 1 ==> 6
第三步:
中间下标元素是 下标为5 元素值=11
最小下标为5
最大下标为6
11 < 13
需要修改最小下标 ==> 中间下标 + 1 ==> 6
第四步:
得到结果
/**
* 二分法查找算法
*
* @param sortedArray 这里要求是一个int类型数组,并且是进过排序之后的升序数组
* @param find 需要查询的元素
* @return 返回值大于等于0找到元素下标位置,没有找返回-1
*/
public static int halfSearch(int[] sortedArray, int find) {
int minIndex = 0;
int maxIndex = sortedArray.length - 1;
int mid = (minIndex + maxIndex) / 2;
while (minIndex <= maxIndex) {
if (sortedArray[mid] > find) {
maxIndex = mid - 1;
} else if (sortedArray[mid] < find) {
minIndex = mid + 1;
} else {
return mid;
}
mid = (minIndex + maxIndex) / 2;
}
return -1;
}