1. 程式人生 > >二分查詢法(遞迴和非遞迴實現)

二分查詢法(遞迴和非遞迴實現)

二分查詢法:

     二分查詢法又稱折半查詢法,優點是比較次數少,查詢速度快,平均效能好;其缺點是要求待查表為有序表,且插入刪除困難。因此,折半查詢方法適用於不經常變動而查詢頻繁的有序列表。(借鑑百度百科)時間複雜度為:log2n,即log以2為底,n的對數。

     1.遞迴方式完成二分查詢法:

    /** 
     * 遞迴方法實現二分查詢法. 
     * @param Array陣列 
     * @param low 陣列第一位置 
     * @param high 最高 
     * @param keyValue 要查詢的值. 
     * @return 返回值. 
     */  
    int binSearch(int Array[],int low,int high,int keyValue)  
    {  
        if (low<=high)  
        {  
            int mid = (low+high)/2;  
            if(keyValue == Array[mid])  
                return mid;  
            else if(keyValue<Array[mid])  
                //移動low和high  
                return binSearch(Array,low,mid-1,keyValue);  
            else if(keyValue>Array[mid])  
                return binSearch(Array,mid+1,high,keyValue);  
        }  
        else  
            return -1;  
    }  
     2.非遞迴實現二分查詢法:
/* 
     * 非遞迴二分查詢演算法 
     * 引數:整型陣列,需要比較的數. 
     */  
    public static int binarySearch(Integer[]intArray,int keyValue){  
        //第一個位置.  
        int low=0;  
        //最高位置.陣列長度-1,因為下標是從0開始的.  
        int high=intArray.length-1;  
        //當low"指標"和high不重複的時候.  
        while(low<=high){  
            //中間位置計算,low+ 最高位置減去最低位置,右移一位,相當於除2.也可以用(high+low)/2  
            int middle=low+((high-low)>>1);  
        //與最中間的數字進行判斷,是否相等,相等的話就返回對應的陣列下標.  
        if(kyValue==intArray[middle]){  
            return middle;  
        //如果小於的話則移動最高層的"指標"  
        }else if(keyValue<intArray[middle]){  
            high=middle-1;  
        //移動最低的"指標"   
        }else{  
            low=middle+1;  
            }  
        }  
        return-1;  
        }  
      
}  
查詢到了則返回資料陣列的下標,沒查詢到則返回-1.