算法之二分查找(c++版实现+测试)

本文介绍了如何使用C++实现递归和非递归两种方式的二分查找算法,包括核心算法代码展示及测试用例,帮助读者深入理解二分查找的原理和应用。
摘要由CSDN通过智能技术生成

进阶版入口
递归版算法(deep变量是为了测试,实际生产可不需要):
核心算法:

#include <iostream>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <string>

using namespace std;

template<typename T,typename Container>
int Rank(const T& key, const Container& c, const int& lo,const int& hi,int& deep)
{
    if (lo > hi) return -1;
    int mid = lo + (hi - lo) / 2;
    //use to test
    cout << "deep: " << deep << ends
         << "lo  : " << lo   << ends
         << "hi  : " << hi   << endl;
    if (key > c[mid])
    {
        ++deep;
        return Rank(key, c, mid + 1, hi,deep);
    }
    else if (key < c[mid])
    {
        ++deep;
        return Rank(key, c, lo, mid - 1,deep);
    }
    else return mid;
}
template<typename T,typename Container>
int BinarySearch(const T& key,Container& c)
{
    //deep表示 递归深度
    int deep = 0;
    //必须要排序 可以把这步放在调用BinarySearch()之前避免对一个序列
    //重复调用sort();
    sort(begin(c), end(c));
    return Rank(key, c, 0, static_cast<int>(end(c)-begin(c))-1,deep);
}

测试专用代码:

void test(const string& mode, const string& file)
{
    ifstream in(file);
    vector<int> c;
    copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(c));
    auto f = [=,&c](const int& key)
    {
        //从标准输入找出文件中存在的
        if (mode == "exist")
        {
            if (BinarySearch(key, c) != -1)
            {
                cout << "the key: " << key << "is exist in" << file << endl;
            }
        }
        if (mode == "noexist")
        {
            if (BinarySearch(key, c) == -1)
            {
                cout << "the key: " << key << "is not exist in" << file << endl;
            }
        }
    };
    for_each(istream_iterator<int>(cin), istream_iterator<int>(),f);
}

main.cpp

int main()
{
    test("exist", "test.txt");
    system("pause");
    return 0;
}

这里写图片描述

非递归算法:

#include <iostream>
#include <vector>
#include <fstream>
#include <iterator>
#include <algorithm>
#include <string>

using namespace std;

template<typename T,typename Container>
int BinarySearch(const T& key, Container& c)
{
    sort(begin(c), end(c));
    int lo = 0;
    int hi = static_cast<int>(end(c) - begin(c))-1;
    while (lo <= hi)
    {
        int mid = lo + (hi - lo) / 2;
        if (c[mid] > key)
            hi = mid - 1;
        else if (c[mid] < key)
            lo = mid + 1;
        else
            return mid;
    }
    return -1;
}

测试代码:

void test(const string& mode, const string& file)
{
    ifstream in(file);
    vector<int> c;
    copy(istream_iterator<int>(in), istream_iterator<int>(), back_inserter(c));
    auto f = [=,&c](const int& key)
    {
        //从标准输入找出文件中存在的
        if (mode == "exist")
        {
            if (BinarySearch(key, c) != -1)
            {
                cout << "the key: " << key << " is exist in" << file << endl;
            }
        }
        if (mode == "noexist")
        {
            if (BinarySearch(key, c) == -1)
            {
                cout << "the key: " << key << "is not exist in" << file << endl;
            }
        }
    };
    for_each(istream_iterator<int>(cin), istream_iterator<int>(),f);
}

main.cpp

int main()
{
    test("exist", "test.txt");
    system("pause");
    return 0;
}

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值