C++二分查找
二分查找又称折半查找,它是对已经排好序的数组,每次取这个数和数组中间的数进行比较,复杂度是O(logn)
如:设数组为a[n]
,查找的数``x,
如果x==a[n/2]
,则返回true
;
如果x < a[n/2]
,则在a[0]到a[n/2-1
]中进行查找;
如果x > a[n/2]
,则在a[n/2+1]到a[n-1]
中进行查找;
优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查数组为有序数组,且插入删除困难。
写代码时候我们先用array
或者vector
,直接调用sort
函数先对数组进行排序。
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
bool find_binary(int target,vector<int>& arr)
{
if(arr.empty())
return false;
int low = 0;
int high = arr.size() - 1;
while(low<=high)
{
int middle = (low + high)/2;
if(target==arr[middle])
return true;
else if(target>arr[middle])
low = middle + 1;
else
high = middle-1;
}
return false;
}
int main()
{
int a[] = {3,5,7,9,2,3,1,0,7,5,4};
int len = sizeof(a)/sizeof(int);
//cout <<len<<endl;
vector<int> arr(a,a+len);
std::sort(arr.begin(),arr.end());
vector<int>::iterator it;
/*
for(it=arr.begin();it!=arr.end();it++)
{
cout<<*it<<endl;
}
*/
int b = 5;
cout<<find_binary(b, arr)<<endl;
return 0;
}
可以解决剑指offer中二维数组中的查找那道题目
题目描述
在一个二维数组中(每个一维数组的长度相同),
每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。
请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
思路:把每一行看成有序递增的数组,利用二分查找,通过遍历每一行得到答案,时间复杂度是O(nlogn)
。
代码:
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
if(array.empty())
return false;
//int row = array.size();
int col = array[0].size();
for(int i = 0; i<col; i++)
{
int low = 0;
int high = array[0].size();
while(low<=high)
{
int middle = (low + high)/2;
if (target == array[i][middle])
return true;
else if(target > array[i][middle])
low = middle + 1;
else
high = middle - 1;
}
}
return false;
}
};