//非递归实现二分法
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不指向这个节点。
——————————————————————————————————————————————————
//递归实现二分法
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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。