二分查找实现与算法分析
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;
}
//二分查找递归算法
//时间复杂度 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;
}
相关文章推荐
- 二分查找算法递归实现
- 二分查找算法的实现-分治策略
- 算法学习---对象类型的数组二分查找实现
- 基于数组二分查找算法的实现
- 算法-对分查找(二分查找)C++实现
- 实用算法实现-第 5 篇 二分查找树
- 二分查找,二叉查找树(二叉排序树)的基本思想以及算法实现
- 算法学习---对象类型的数组二分查找实现
- 二分查找的算法实现
- 【数据结构与算法】【查找】折半查找(二分查找)的代码实现
- 【算法分析】查找算法:二分查找、顺序查找
- 二分查找算法的C/C++实现
- 实现二分查找的算法
- 笔试算法题(58):二分查找树性能分析(Binary Search Tree Performance Analysis)
- 算法学习---基本数据类型的数组二分查找实现
- 二分查找实现与分析
- KMP子字符串查找算法分析与实现
- 算法:查找----二分查找(Java实现)
- 算法2,用递归的模式实现二分查找
- 【算法拾遗】二分查找递归非递归实现