二分查找法 C++版

版权声明:本文为博主原创文章,转载请注明出处。作者:ISmileLi 博客地址:http://blog.csdn.net/toby54king。 https://blog.csdn.net/toby54king/article/details/84110065

一、实现原理看下面代码中的注释。

二、实现方法及测试代码如下:

#include <iostream>

using namespace std;

/******************************
二分查找:又称折半查找,二分查找要求查找的数据必须是有序的,选取中间的数据为基数,
将数据分成两部分与查找关键字进行比较,如果关键字大于基数则在基数右半部分查找(此处
假设安升序排列),否则在左半部分查找。
优点:1、速度快 2、平均性能好
缺点:1、数据必须有序
算法时间复杂度:O(log2n,以2为底n的对数) 空间复杂度:O(n)+辅助空间
******************************/

// 方法一 递归查找
template<typename T>
int half_find(T data[],int left,int right,T target)
{
    if(left>right)
        return -1;

    int mid = left+(right-left)/2; // 防止整数溢出问题
    if(data[mid]>target)
    {
        //right = mid-1;
        return half_find(data,left,mid-1,target);
    }
    else if(data[mid]<target)
    {
        //left = mid+1;
        return half_find(data,mid+1,right,target);
    }
    else
    {
        return mid;
    }
}

// 方法二 非递归查找
template<typename T>
int half_find_T(T data[],int n,T target)
{
    int left = 0;
    int right = n-1;
    while(left<=right)
    {
        int mid = left+(right-left)/2; // 防止整数溢出问题
        if(data[mid]>target)
        {
            right = mid-1;
        }
        else if(data[mid]<target)
        {
            left = mid+1;
        }
        else
        {
            return mid;
        }
    }
    return -1;
}

int main()
{
    int tmpArr[] = {0,1,2,3,4,5,6,7,8,9};
    //int ret = half_find(tmpArr,0,10,5);
    int ret = half_find_T(tmpArr,10,5);
    if(ret != -1)
    {
        cout << "find it!" << endl;
    }
    else
    {
        cout << "can't find it!" << endl;
    }
    cout << "Hello World!" << endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/toby54king/article/details/84110065