问题的引出代码如下:
public static void main(String[] args)
{
int arr[] = {1, 2, 3, 4, 5};
int refen = Refen(arr, 4);
System.out.println(refen);
}
private static int Refen(int arr[], int value)
{
int left = 0;
int right = arr.length - 1;
int mid = 0;
// 循环次数为 L 次 , 问题是里面的if else if 判断了多少次
// 左边找元素,如果第一个if 成立了,那么第二个if 就不会执行了
// 右边找元素,如果第二个if 成立了,那么第一个if 也会被执行
// 现在的问题就是,左边 找元素 和 右边找元素并不是平衡的
// 向左找成本低,只需要比较一次。向右找成本高,需要比较两次
while(left < right)
{
mid = (left + right) >> 1;
if(arr[mid] < value)
{
left = mid + 1;
}else if(arr[mid] > value)
{
right = mid - 1;
}else
{
return mid;
}
}
return -1;
}
优化后的代码如下:
public static void main(String[] args)
{
int arr[] = {1, 2, 3, 4, 5};
int i = lineSearch(arr, 3);
System.out.println(i);
}
private static int lineSearch(int arr[], int value)
{
int i = 0;
int j = arr.length;
int mid = 0;
// j - 1代表 待查找的元素个数
while(1 < j - i)
{
mid = (j + i) >>> 1;
// 中间值小于目标值时满足条件
if(arr[mid] < value)
{
i = mid;
}else
{
j = mid;
}
}
if(arr[j] == value)
{
return j;
}else
{
return -1;
}
}