二分查找法(折半查找法)
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。
但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
二分查找法思路:
(1)首先保证查找的数组是有序的。
(2)确定数组的中间下标:mid = (left + right) /2;
(3)比较需要查找的值与arr[mid]
如果findVal < arr[mid],继续向左递归查找
如果findVal > arr[mid],继续向右递归查找
如果findVal = arr[mid],说明找到,但要进行是否有多项符合处理:
定义一个辅助指针temp,向左右查找是否还有与findVal相同的值。
(4)结束条件:
找到findVal相等的值就结束递归
如果没有找到与findVal相等的值,那么就直到left>right时结束。
实现代码:
package com.java;
import java.util.ArrayList;
import java.util.List;
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {-1,1,100,158,1000,1000,1999};
System.out.println(binarySearch(arr, 0, arr.length, 1000));
}
public static List<Integer> binarySearch(int[] arr,int left,int right,int findVal)
{
if (left > right)
return null;
int mid = (left + right) / 2;
if (findVal < arr[mid])
{
return binarySearch(arr,left,mid -1,findVal);
}
else if (findVal >arr[mid])
return binarySearch(arr,mid + 1,right,findVal);
else
{
List<Integer> list = new ArrayList<>();
int temp = mid - 1;
while (true)
{
if (temp<0 || findVal != arr[temp]) break;
list.add(temp);
temp -= 1;
}
list.add(mid);
temp = mid + 1;
while (true)
{
if (temp>arr.length-1||findVal!=arr[temp])
break;
list.add(temp);
temp+=1;
}
return list;
}
}
}