注意:二分查找的前提时数组已经有序了
二分查找思想:
1.组中找到一个最左边的下标 left=0;找到最右边的下标right=长度-1(左闭右闭区间),再设一个中间值mid=left+(right-left)/2;2.循环时,左边要小于等于右边(左闭右闭时[left,right]),左边小于右边(左闭右开时[left,right) );3.当查找的值比mid大时,左边的下标移mid的下一位:left=mid+1;4.当查找的值比mid小时,右边的下标移到mid的上一位,right=mid-1(左闭右闭时),right=mid(左闭右开时);5.如果找到的话,返回下标,如果没有找到,返回-1 public class Practice{ //二分查找数组已经有序 public static int binarySearch(int [] array,int key){ int left=0; int right=array.length-1; while(left<=right){ int mid=left+(right-left)/2; //防止溢出 if(key>array[mid]){ left=mid+1; } else if(key<array[mid]){ right=mid-1; } else{ return mid; } } return -1; } public static void main(String[] args){ int [] array={1,2,3,4,5,6,7}; int y=binarySearch(array,2); if(y==-1){ System.out.println("没有找到这个数"); } else{ System.out.println("下标为:"+y); } } }二分查找的递归形式:
import java.util.Scanner; public class Main { //实现递归的二分算法 public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int [] array = new int[n]; for(int i = 0; i < n; i++){ array[i] = sc.nextInt(); } int cur = sc.nextInt(); System.out.println(search(array,0, n-1, cur)); } private static int search(int[] array,int start, int end, int cur) { int mid = (start + end) / 2; if(start > end){ return -1; } if(cur > array[mid]){ return search(array, mid + 1, end, cur); } else if(cur < array[mid]){ return search(array, start, mid - 1, cur); } else if(cur == array[mid]){ return mid; } return -1; } }