二分查找

85 阅读1分钟

如何在一个无序的数列中查找到一个指定的数据,就涉及到查找的问题。最直观想到的方法无非就是从头到尾一个一个的比较,直到中间某个数据符合或是到最后一个元素查找失败。但这样做时间复杂度较大,很难满足程序的需求,故我们需要一些更加高效的算法,而二分查找就是一个使用很普遍的算法。

二分查找的基本思想

在一个查找区间中,确定出查找区间的中心位置,用待查找数据元素的关键字和中心位置上数据元素的关键字比较,若两者相等,则查找成功;否则,若前者小于后者,则把查找区间定位原查找区间的前半段继续这样的过程;否则,,若前者大于后者,则把查找区间定位原查找区间的后半段继续这样的过程;这样的查找过程一直进行到查找区间的上界小于查找区间的下界为止。

二分查找算法既可以设计成递归的方式,也可以设计成循环结构的算法。

建立在数组结构上的两种方式的二分查找如下:

//非递归方式实现二分查找
    int binarySearch(int arr[],int key){
        int mid;
        int start=0;
        int end = getArrayLen(arr)-1;
        while(start<end){
            mid=(start+end)/2+start;
            if(arr[mid]==key)
                return mid;
            else if(key<arr[mid]){
                end=mid-1;
            } else if(key>arr[mid]){
                start=mid+1;
            }
        }
        return -1;
    }
//递归方式实现二分查找
    int binarySearch_recursion(int arr[],int start,int end,int key){
        int mid;
        while(start<end){
            mid=(start+end)/2+start;
            if(arr[mid]==key)
                return mid;
            else if(key<arr[mid]){
                end=mid-1;
                binarySearch_recursion(arr,start,end,key);
            } else if(key>arr[mid]){
                start=mid+1;
                binarySearch_recursion(arr,start,end,key);
            }
        }
        return -1;
    }