package com.hyl.suanfa;
/**
* 二分法查询
*/
public class ErFenFa {
/*
问题:找到数字15的下标
正常思路:遍历数组,判断值等于15
缺点:如果数组过大,循环判断效率会低
优点:不管是否已经排序,都可以查询
二分法:
优点:查询快
缺点:只能对已经排序的数组查询
思路:每次取中间下标的值与目标值比较,大于目标值取中间下标左侧数据比较,小于目标值取中间下标右侧数据比较(每次都中间分割)
*/
public static void main(String[] args) {
int[] nums = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18};
//思路一:遍历数组,判断值等于15。大多数人的第一思路
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 15) {
System.out.println(i);
}
}
//二分法
int targetNum = 15;//目标值
int startIndex = 0;//开始下标
int endIndex = nums.length - 1;//结束下标
int moddleIndex = 0;//中间下标
//开始下标和结束下标相等则跳出循环
while (startIndex <= endIndex) {
moddleIndex = (startIndex + endIndex) / 2;//取中间数
if (nums[moddleIndex] > targetNum) {
endIndex = moddleIndex - 1;
} else if (nums[moddleIndex] < targetNum) {
startIndex = moddleIndex + 1;
} else {
break;
}
}
System.out.println(moddleIndex);
}
}