二分查找法的细节(mid值 整数溢出问题)

二分查找法是最常用的查找法之一,相较于其他的查找法,二分查找法,在程序的coding,运行效率上都有一定的优势。

这是我未发现问题时前写的:

int search(int[] arr,int low ,int high,int value){
       if(low > high ||
        	value < arr[low] || value > arr[high]) return -1;
        
       int mid = (low+high)/2;
       
       if(value < arr[mid]) return search(arr,low,mid-1,value);
       else if (value > arr[mid]) return search(arr,mid+1,high,value);
       else return mid;
    }

但是若 low+high > Interger.MAX_VALUE 时,此时会导致数据溢出,则导致mid错误,
所以 mid 应该改为 low +(high - low)/ 2;
这样能使得mid的值保持正确。也能方便其他由二分查找法所改的查找法mid公式的记忆。
插值查找法 mid = low + (high - low) * (val - arr[low] ) / (arr[high] - arr[low]))
斐波那契查找法 mid = low + fib[k-1]-1;//具体实现与含义此处不体现

int search(int[] arr,int low ,int high,int value){
       if(low > high ||
        	value < arr[low] || value > arr[high]) return -1;
        
       int mid =  low +(high - low)/ 2;
       
       if(value < arr[mid]) return search(arr,low,mid-1,value);
       else if (value > arr[mid]) return search(arr,mid+1,high,value);
       else return mid;
    }

你可能感兴趣的:(算法)