二分查找法

一、算法思想:

  对于一个已经排序好的序列(使用二分查找法的前提条件,在本篇文章中假设序列是升序排列的),在查找某个元素时,首先与序列中间的元素进行比较,如果大于这个元素,就在当前序列的后半部分继续查找,如果小于这个元素,就在当前序列的前半部分继续查找,直到找到相同的元素,或者所查找的序列范围为空为止。如果查到了这个元素,返回元素所在的序列的位置,如果没有查到,返回-1。

二、程序实现:

 《二分查找学习札记》这篇博客详细讲解了二分查找法以及常见的主要问题,链接:http://www.cppblog.com/converse/archive/2009/10/05/97905.html

三、附上JAVA版的用迭代方式和递归方式实现二分查找算法:

  

public class BinSearch {
    public static void main(String[] args) {
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        int searchNum = 8;
        //调用方法查找:
        //1、迭代方式:
        int returnNum_iteration = binarySearch_iteration(array, searchNum);
        System.out.print("迭代方式的输出结果:");
        System.out.println("要查找的元素在数组的下标:" +  returnNum_iteration);

        //2、递归方式:
        int returnNum_recurse = binarySearch_recurse(array, searchNum, 0, array.length - 1);
        System.out.print("递归方式的输出结果:");
        System.out.println("要查找的元素在数组的下标:" + returnNum_recurse);
    }

    //迭代方式实现二分查找
    public static int binarySearch_iteration(int[] array, int searchNum) {
        int low=0;
        int high=array.length-1;
        int middle=0;
        while (low <= high) {
            middle = low + (high - low) / 2;   // int middle = (low + high) / 2;
            if (searchNum == array[middle]) {
                return middle;
            } else if (searchNum > array[middle]) {
                low=middle+1;
            } else {
                high=middle-1;
            }
        }
        return -1;
    }
    

    //递归方式实现二分查找

    public static int binarySearch_recurse(int[] array, int searchNum, int low, int high) {
        if (low <= high) {
            int middle = low + (high - low) / 2;   // int middle = (low + high) / 2;
            if (searchNum == array[middle]) {
                return middle;
            } else if (searchNum > array[middle]) {
                return binarySearch_recurse(array, searchNum, middle + 1, high);
            } else {
                return binarySearch_recurse(array, searchNum, low, middle - 1);
            }
        }
        return -1;
    }

}

注释:

    1、什么是递归

  递归就是程序不停地间接或者直接调用自身,直到满足条件后退才出的一种算法。下面是递归实现阶乘计算的例子:

  (1)计算n的阶乘的代码:

public long Factorial(int n) 
{ 
if (n == 0)//限制条件,对该方法调用自己做了限制 
return 1; 
return n * Factorial(n - 1); 
}

  (2)递归执行图:

                   

 

posted @ 2017-08-20 23:16  AI菌  阅读(381)  评论(0编辑  收藏  举报