您的位置:首页 > 编程语言 > C语言/C++

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

2017-07-10 19:39 525 查看
进阶版入口

递归版算法(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;
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息