二分查找应用于已排好序的数组,手写二分查找代码如下:
class ArrDemo{
	public static void main(String[] args){
		int[] arr1 = {1,4,13,17,21,33,46,76,99,};
		
		System.out.println(halfSearch(arr1,21));
		System.out.println(getIndex(arr1,13));
		
	}
	
	//折半查找法:应用的前提是数组已经排好序
	public static int halfSearch(int[] arr, int key){
		int min = 0;//记录数组起始下表
		int max = arr.length-1;//记录数组最后下标
		int mid = (min+max)/2;//计算中间下标
		while(key != arr[mid])
		{//如果中间那个值不是要找到结果
			if(key > arr[mid])
			{//key大于中间值
				min = mid + 1;
			}
			if(key < arr[mid])
			{
				max = mid - 1;
			}
			if(min > max)
			{
				return -1;
			}
			//重新计算中间下标
			mid = (min + max)/2;
		}
		return mid;
	}
	
	//一般查找:
	public static int getIndex(int[] arr,int key){
		for(int i=0;i<arr.length;i++){
			if(key == arr[i])
			{
				return i;
			}
		}
		return -1;
	}
	
}
在java_API的Arrays类中,其实也定义了这一方法:
import java.util.Arrays;//Arrays包

class BinarySearch{
	public static void main(String[] args){
		int[] arr1 = {1,2,3,4,5,6,7,8,10,11,12,};//11个元素
		
		//【整体搜索(两参)】
		System.out.println(Arrays.binarySearch(arr1,8));//索引为7
		
		//【局部搜索(四参)】
		System.out.println(Arrays.binarySearch(arr1,2,6,5));
		//需要注意的是当有四个参数时,搜索范围是[ )

		//如果找不到返回(-(插入点)-1) 
		//插入点被定义为:第一个大于此键的元素索引
		
		//【两参找不到的返回】
		System.out.println(Arrays.binarySearch(arr1,9));//(-(8)-1)=-9
		//如果数组中的所有元素都小于指定的键,则为 a.length。
		System.out.println(Arrays.binarySearch(arr1,15));//-12 (-(11)-1)=-12
	
		//【四参找不到的返回】 
		System.out.println(Arrays.binarySearch(arr1,2,6,7));	//(-(-6)-1)=-7 
		//如果范围中的所有元素都小于指定的键,则为 toIndex。
		System.out.println(Arrays.binarySearch(arr1,2,6,16));	//(-(-6)-1)=-7 
	}	
}

binarrySearch的用法:

(1)导包:

import java.util.Arrays;

(2)调用:

Arrays.binarySearch(int[] a , int key)
Arrays.binarySearch(int[] a,int fromIndex,int toIndex,int key)

参数:

  • a - 要搜索的数组
  • fromIndex - 要搜索的第一个元素的索引(包括)
  • toIndex - 要搜索的最后一个元素的索引(不包括)
  • key - 要搜索的值

(3)返回:
找到就返回key的索引(下标),找不到就返回(-(插入点)-1);
插入点被定义为第一个大于此键的元素索引,如果范围中的所有元素都小于指定的键,则为a.length(双参中),或toIndex(四参中)