二分查找属于顺序表查找范围,二分查找也称为折半查找。二分查找(有序)的时间复杂度为O(LogN)。
二分查找概念:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到找到为止。
使用二分查找两个前提条件:
1,待查找的列表必须有序(如果无序则先通过排序算法将其变为有序)
2,必须使用线性表的顺序存储结构来存储数据。
#include "stdafx.h"
#include <iostream>
#include <vector>
#include <time.h>
using namespace std;
//二分法
bool binaryFind(vector<int>& v, int value,vector<int>::iterator& iter)
{
vector<int>::iterator iterBegin = v.begin();
vector<int>::iterator iterEnd = v.end();
vector<int>::iterator iterMid = iterBegin + (iterEnd - iterBegin) / 2;
while (iterBegin < iterEnd)
{
if (value == *iterMid)
{
iter = iterMid;
return true;
}
else if (value > *iterMid)
{
iterBegin = iterMid + 1;
}
else
{
iterEnd = iterMid - 1;
}
iterMid = iterBegin + (iterEnd - iterBegin) / 2;
}
iter = iterEnd;
return false;
}
int main()
{
vector<int> v;
//生成一个较大的数组
for (int i = 0; i <= 10000; i++)
{
v.push_back(i);
}
vector<int>::iterator iter;
clock_t start = clock();
if (binaryFind(v, 10000, iter))
{
cout << "查找到数据" << *iter << endl;
}
else
{
cout << "未查找到该数据" << endl;
}
clock_t finish = clock();
cout <<"所用时间为:"<<(double)(finish - start) / CLOCKS_PER_SEC << endl; //0.001
clock_t start1 = clock();
vector<int>::iterator it = v.begin();
while (it != v.end())
{
if (*it == 10000)
{
cout << "查找到数据" << *it << endl;
break;
}
it++;
}
clock_t finish1 = clock();
cout << "所用时间为:" << (double)(finish1 - start1) / CLOCKS_PER_SEC << endl; //0.014
}
由上可以看出二分法查找和普通遍历查找vector,为别用时为0.001和0.014,在大数量数据上俩个方法的效率存在着巨大的差别。