您的位置:首页 > 其它

二分查找实现与算法分析

2017-05-13 16:36 405 查看
二分查找又名折半查找。找到中间值与要找的数值进行比较,不过的缩小查找空间。这里我们用递归与非递归分别实现,并分析空间复杂度与时间复杂度

//二分查找递归算法
//时间复杂度 O(lg N)
//空间复杂度 O(1g N)
#include<iostream>
using namespace std;
int Binary(int* arr, int data, size_t size, int left, int right)
{
if (left <= right)//区间[]左闭右闭
{
int mid = left + ((right - left) >> 1);
if (arr[mid] == data)
{
return mid;
}
if (arr[mid]<data)
{
left = mid + 1;
size = size - left;
return Binary(arr, data, size, left, right);
}
if (arr[mid]>data)
{
right = mid - 1;
size = right + 1;
return Binary(arr, data, size, left, right);
}
}
cout << "not find" << endl;
return -1;
}
int main()
{
int arr[9] = { 10,23,24,56,87,99,105,123,999};
cout << Binary(arr, 123, 9, 0, 8) << endl;
return 0;
}



在复杂度的时候也可把O(log2 N)=O(lg N)

//二分查找非递归算法
//时间复杂度:O(lg N)
//空间复杂度:O(l)
#include<iostream>
using namespace std;
int Binary(int* arr, int data, size_t size, int left, int right)
{
while (left < right)
{
int mid = left + ((right - left) >> 1);
if (arr[mid] == data)
{
return mid;
}
if (arr[mid] < data)
{
left = mid + 1;
}
if (arr[mid] > data)
{
right = mid;
}
}
return -1;
}
int main()
{
int arr[10] = { 5,10, 23, 24, 56, 87, 99, 105, 123, 999 };
cout << Binary(arr, 24, 10, 0, 9) << endl;
return 0;
}

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