Java二分法原理与代码实现

二分法:
   1、二分法查找算法是建立在排序的基础之上的,即没有排序的
      数据是无法查找的;

   2、二分法查找的效率高于"一个挨着一个"的这种查找方式;
   3、二分法查找原理?我们用一个例子来说明;
      int[] arr ={0,5,9,10,20,60,70,80,90,100};
      目标:找出100的下标:
      数组元素为:0(下标为0) 5 9 10 20 60 70 80 90 100(下标为9);
      3.1、找出中间元素:(0+9) / 2 --> 4(中间元素);
      3.2、用找到的中间元素跟目标元素比较:20 < 100, 此时说
               所要查找的元素在中间元素的右边,则开始下标就变
               成了:4 + 1;
      3.3、继续循环,找出中间值:(5+9) / 2 --> 7(中间元素);
      3.4、用找到的中间元素跟目标元素比较:80 < 100, 此时说
               所要查找的元素在中间元素的右边,则开始下标就变
               成了:7 + 1;
      3.5、继续循环,找出中间值:(8+9) / 2 --> 8(中间元素);
      3.6、用找到的中间元素跟目标元素比较:90 < 100, 此时说
               所要查找的元素在中间元素的右边,则开始下标就变
               成了:8 + 1;
      3.7、继续循环,找出中间值:(9+9) / 2 --> 9(中间元素);
      3.8、用找到的中间元素跟目标元素比较:100 = 100, 此时说
               明目标元素已被找到;

   4、代码的实现:

public static void main(String[] args) {
    int[] arr ={0,5,9,10,20,60,70,80,90,100};

    // 找出这个数组中 9 所在的下标
    // 调用方法
    // int index = Arrays.binarySearch(arr,9); 调用了sun公司中的数组工具类
    int index = binarySearch2(arr,9);
    System.out.println(index == -1?"该元素不存在":"该元素的下标为"+index);
}

/**
 * 从数组中查找目标元素的下标
 * @param arr 目标数组
 * @param dest 目标元素
 * @return -1表示该元素不存在,返回其它表示返回该元素的下标
 */
public static int binarySearch2(int[]arr,int dest) {
    // 开始下标
    int begin = 0;
    // 结束下标
    int end = arr.length-1;

    // 开始元素的下标只要在结束元素的下标发左边,就可以继续循环
    while (begin <= end){
        // 中间元素下标
        int mid = (begin + end) / 2;
        if (arr[mid] == dest){
            return mid;
        }else if (arr[mid] < dest){
            // 目标在中间元素的右边
            // 开始元素下标发生改变
            begin = mid + 1; // 一直增
        }else {
            // arr[mid] > dest
            // 目标在中间元素的左边
            end = mid - 1; // 一直减
        }
    }
    return -1;
}

总结:在需要查找元素时,如果是一对数字,首选方法为二分法,因为二分法的效率高,而且也比较便捷,用起来更方便,但是,最重要的一点还是"要对目标数组进行排序",有关于数组的排序,可翻我的上一篇博客。在Java中,sun公司也帮我们写好了二分法的代码,我们可以通过"Arrays.binarySearch(目标数组,目标元素);",我们可以通过"Arrays.sort(目标数组);"进行对数组的排序,然后在通过"Arrays.binarySearch(目标数组,目标元素);"进行查找,又方便效率也高。

你可能感兴趣的:(Java二分法原理与代码实现)