目前在剑指offer中遇到的题和常用的折半查找算法,如果再遇到再追加总结
##一般的折半查找算法

package althorgrim;  
/** 
 * 1、必须采用顺序存储结果 
 * 2、关键字必须有序 
 */  
public class TestBinarySearch {  
      
      
    public static int binarySearch(int a[],int goal){  
        int high=a.length-1;   //   设定最高位置的下标
        int low=0;   //  设定最低位置的下标
        while (low<=high) {    //  如果low》high则跳出,就是没找到
            int middle=(low+high)/2;    //   设定中间位置的下标
            if (a[middle]==goal) {  //   如果中间正好是,那么直接返回位置就好
                return middle;  
            }  
            else if (a[middle]>goal) {  //如果中间值大于该值,说明该值在中间值左边区间,所以令high=middle-1,在左侧区间继续查找
                high=middle-1;  
            }  
            else {    //如果中间值小于该值,说明该值在中间值右边区间,所以令high=middle-1,在右侧区间继续查找
                low=middle+1;  
            }  
        }  
        return -1;  
      
          
    }  
    /** 
     * @param args 
     */  
    public static void main(String[] args) {  
        // TODO Auto-generated method stub  
        int[] src = new int[] {1, 3, 5, 7, 8, 9};  
        System.out.println(binarySearch(src, 3));   
    }  
  
}  

##旋转数组的折半查找算法
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。

package Arrays;

public class Solution {
	public int minNumberInRotateArray(int[] array) {
		 int low = 0 ; int high = array.length - 1;  //分别是第一个元素和最后一个元素的下标 
	        while(low <= high){
	            int mid = (high + low) / 2;  //获取了中间元素的下标      
	            if(array[mid] > array[high]){  //如果中间元素大于最高的,说明最小值在中间元素右边
	                low = mid + 1;
	            }else if(array[mid] == array[high]){
	                high = high - 1;
	            }else{
	                high = mid;//如果中间元素小于最高的,说明最小值在中间元素左边或者就是中间元素
	            }   
	        }
	        return array[low];
    }
	

	public static void main(String[] args) {
		int[] array = { 3, 4, 5, 2, 2,3 };
		Solution s = new Solution();
		System.out.println(s.minNumberInRotateArray(array));
	}
}