二分查找法

public class Test {
    public static void main(String[] args) {
        int[]a={1,5,8,9,11,12,56,89};
        int i = binarySearch(a, 56);
        System.out.println(i);

    }

    /**
     * 又叫折半查找,要求待查找的序列有序。每次取中间位置的值与待查关键字比较,如果中间位置
       的值比待查关键字大,则在前半部分循环这个查找的过程,如果中间位置的值比待查关键字小,
       则在后半部分循环这个查找的过程。直到查找到了为止,否则序列中没有待查的关键字。
     * @param arr
     * @param b
     * @return
     */
    public static int binarySearch(int[]arr,int b){
        if(null==arr || arr.length==0){
            return -1;
        }
        int leftIndex=0;//查找区间的左边索引
        int rightIndex=arr.length-1;//查找区间的右边索引
        int mid=0;//区间的中间索引
        while (leftIndex<=rightIndex){ //当左边的索引小于等于右边的索引时,可以继续取中间值
            mid=(leftIndex+rightIndex)/2;//中间索引值
            if(arr[mid]==b){ //如果中间索引所在的数据与需要查找的数据相等,则返回索引值
                return mid;
            }

            if(arr[mid]>b){//b在左
                rightIndex=mid-1;//如果需要查找的值在左边区间,则右边的索引要改为中间索引mid,又因为上一步知道arr[mid]!=b,所以要用mid-1作为右区间索引
            }else {
                leftIndex=mid+1; //b在右边,同理所以mid+1
            }
        }
        return -1;//找不到时
    }
}

 

posted @ 2019-05-20 16:09  yangxiaohui227  阅读(113)  评论(0编辑  收藏  举报