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

C++11写算法之二分查找

2014-04-22 23:19 330 查看
同样的,二分查找很好理解,不多做解释,要注意二分查找的list必须是排好序的。

这里实现了两种二分查找的算法,一种递归一种非递归,看看代码应该差不多是秒懂。想试验两种算法,改变一下findFunc函数指针(auto findFunc = RecursionBinaryFind; //BinaryFind )即可。

时间复杂度:O(lgn)

空间复杂度:O(1)

除了顺序查找和二分查找,还有一些需要借助某些数据结构才能进行查找的算法,例如:分块查找,二叉排序树查找,哈希查找,B树/B+树/B*树查找等,这些算法的重点更偏向于数据结构本身,因而将放在数据结构部分进行示例。

show me the code !

// #if __cplusplus < 201103L
// #error "must be compiled under c++11 support platform!!!"
// #endif
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cassert>
using namespace std;

//WARNING : input varList of function RecursionBinaryFind must be sorted!!!
int RecursionBinaryFindImp(const int varList[], const int begin,const int end, const int target)
{
if (!varList || begin > end)
{
return -1;
}
int index = -1;
int mid = (begin + end) >> 1;

if (target == varList[mid])
{
index = mid;
}
else if (target < varList[mid])
{
index = RecursionBinaryFindImp(varList,begin,mid - 1,target);
}
else if (target > varList[mid])
{
index = RecursionBinaryFindImp(varList, mid + 1, end, target);
}

return index;
}
int RecursionBinaryFind(const int varList[], const int size, const int target)
{
if (!varList || size < 0)
{
return -1;
}
return RecursionBinaryFindImp(varList,0,size-1,target);
}

//WARNING : input varList of function SequentialFind must be sorted!!!
int BinaryFind(const int varList[], const int size, const int target)
{
if (!varList || size < 0)
{
return -1;
}
int index = -1;
int begin = 0;
int end = size - 1;
int mid = (begin + end) >> 1;
while (begin<end)
{
if (target == varList[mid])
{
break;
}else if (target < varList[mid])
{
end = mid - 1;
}else if (target > varList[mid])
{
begin = mid + 1;
}
mid = (begin + end) >> 1;
}
index = mid;
return index;
}

void test()
{
//case counter
int testCase = 0;
//find function object
auto findFunc = RecursionBinaryFind; //BinaryFind
//show case result lambda function
auto showFunc = [&testCase](){cout << "case[" << testCase++ << "] ok... "<<endl; };

cout << "test begin : " << endl << endl;

//case empty list
{
assert(-1 == findFunc(nullptr, 0, 0));
showFunc();
}
//case wrong list size
{
const int testList[] = { -12, -3, 0, 1, 2, 3, 12, 34, 56 };
assert(-1 == findFunc(testList, 0, 0));
showFunc();
}
//case not found
{
const int testList[] = { -12, -3, 0, 1, 2, 3, 12, 34, 56 };
const int size = sizeof(testList) / sizeof(int);
const int target = -33;
assert(-1 == findFunc(testList, 0, 0));
showFunc();
}
//case found at begin position
{
const int testList[] = { -12, -3, 0, 1, 2, 3, 12, 34, 56 };
const int size = sizeof(testList) / sizeof(int);
const int target = -12;
assert(0 == findFunc(testList, size, target));
showFunc();
}
//case found at random position
{
const int testList[] = { -12, -3, 0, 1, 2, 3, 12, 34, 56 };
const int size = sizeof(testList) / sizeof(int);
const int target = 1;
assert(3 == findFunc(testList, size, target));
showFunc();
}
//case found at end position
{
const int testList[] = { -12, -3, 0, 1, 2, 3, 12, 34, 56 };
const int size = sizeof(testList) / sizeof(int);
const int target = 56;
assert(size - 1 == findFunc(testList, size, target));
showFunc();
}

cout <<endl<< "test done ! " << endl << endl;
}

int main(int argc, char* argv[])
{
test();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: