二分法的簡單實現-------遞歸和非遞歸

//非遞歸實現二分法數組

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);
    }

}
相關文章
相關標籤/搜索