//非递归实现二分法数组
public class Jianzhi{ public static void main (String[] args){ int[] num = {1,2,3,4,5,100}; int m = find(num , 5) ; System.out.println(m); } public static int find(int[] list , int m ){ if(list == null ){ System.out.println("输入的数组长度出错。") ; }else if(list.length ==1 ){ //若是传入的数组只有一个数字 int n = list[0]==m?0:-1 ; return n ; }else { int left = 0 ; int right = list.length-1 ; while(left <= right){ int mid = (left + right)/ 2 ; if(list[mid]==m){ return mid ; }else if (list[mid]<m){ left = mid + 1 ; }else if(list[mid]>m){ right = mid - 1 ; } } System.out.println("未在数组中找到数字"+m); } return -1 ; } }
//注意: 1.须要把mid放入循环中,不能放在循环体外,由于每次都要把mid赋值给left或者right若是放在外面每次赋值的数都同样会死循环。
// 2.写二分法时须要判断循环什么时候终止,若是每次都是left=mid,right=mid,会致使循环没法终止
// ,因此此处用了left=mid+1 right=mid-1 。这样作还有一个好处:发现mid不是所要找的数时,就直接舍弃,让left和right不指向这个节点。code
——————————————————————————————————————————————————递归
//递归实现二分法class
public class Jianzhi{ // (目标数组,目标值,左边界,右边界) public static int find(int[] list , int m ,int begin , int end) { if(list == null){ System.out.println("输入的数组是null"); return -1 ; } if(list.length == 1 ){ return list[0]==m?0:-1 ; } if(begin > end){ return -1 ; } int mid = (begin + end) / 2 ; if(list[mid] == m){ return mid ; }else if (list[mid] < m ){ return find(list , m ,mid+1 , end ); }else if (list[mid] > m ){ return find(list , m , begin , mid-1 ); } return -1 ; } public static void main (String[] args){ int[] num = {1,2,3,4,5,100}; int m = find(num , 1,0,num.length-1) ; System.out.println(m); } }