3 二分查找

 1.算法简介

  1.二分查找又称折半查找,它是一种效率较高的查找方法。

  2.二分查找要求:(1)必须采用顺序存储结构 (2)必须按关键字大小有序排列(可以从小到大也可以由大到小)

2.原理

  将数组分为三部分,依次是中值(所谓的中值就是数组中间位置的那个值)前,中值,后;将要查找的值和数组的中值进行比较,若小于中值则在中值前面找,若大于中值则在中值后面找,等于中值时直接返回。然后依次是一个递归过程,将前半部分或者后半部分继续分解为三部分。

3.动图演示

   

4.代码

  

public class BinarySearch {

    //循环实现二分查找算法
    public static int binSerch(int srcArray[], int key) {

        //求出中间值
        int mid = srcArray.length / 2;
        int start = 0;
        int end = srcArray.length - 1;
        //如果查找值等于中间值,则直接返回中间值的key
        if (key == srcArray[mid]) {
            return mid;
        }
        //如果key比中间值小则终值为中间值-1进行下一次循环,如果key比中间值大则开始值为中间值+1进行下一次循环
        while (start < end) {
            mid = (end - start) / 2 + start;
            if (key < srcArray[mid]) {
                end = mid - 1;
            } else if (key > srcArray[mid]) {
                start = mid + 1;
            } else {
                return mid;
            }
        }
        return -1;
    }

    /*递归实现查找算法,如果key等于中间位置的值则直接返回中间值的位置,如果key小于中间值,则调用下一次循环end值为中间值的前一位
      如果key大于中间值则调用下一次循环start值为中间值的后一位*/
    public static int binSerch(int srcArray[], int key, int start, int end) {
        int mid = (start + end) / 2;
        if (key == srcArray[mid]) {
            return mid;
        } else if (start > end) {
            return -1;
        }
        if (key < srcArray[mid]) {
            return binSerch(srcArray, key, start, mid - 1);
        } else if (key > srcArray[mid]) {
            return binSerch(srcArray, key, mid + 1, end);
        }
        return -1;
    }

    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5, 66, 77, 88, 99};
        int seachValue = 88;

        System.out.printf("开始进行循环二分查找%s的位置为%s", seachValue, binSerch(arr, seachValue));
        System.out.println();
        System.out.printf("开始进行递归二分查找%s的位置为%s", seachValue, binSerch(arr, seachValue, 0, arr.length - 1));
    }

}

 

posted @ 2019-02-15 14:27  挚爱敬明  阅读(128)  评论(0编辑  收藏  举报