语言:C++
环境:Windows 8, Visual studio 2013
二分查找:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
要求:
1.必须采用顺序存储结构
2.必须按关键字大小有序排列。
时间复杂度:
O(logN)
#include <iostream>
using namespace std;
#include <assert.h>
//注意点,边界问题 ,这就是为什么mid+1或者-1的原因
//[]边界
//[)
int Binsearch(int *arr, int len,int key)
{
assert(arr);
int begin = 0;
int end = len-1; // len
int mid;
while (begin <= end) // <
{
//mid = (begin + end) / 2; 溢出
mid = begin + ((end - begin) >> 1); //注意操作符的优先级
if (arr[mid] < key)
{
begin = mid + 1; //两个下标相邻 加不上
}
else if (arr[mid] > key)
{
end = mid - 1; //-1 开区间
}
else
return mid;
}
return -1;
}
//递归
int BinsearchR(int *arr, int begin, int end, int key) //问清楚
{
assert(arr);
if (begin > end)
return -1;
int mid = begin + ((end - begin) >> 1); //优先级
if (arr[mid] == key)
return mid;
else if (arr[mid] > key)
BinsearchR(arr, begin, mid-1, key);
else if (arr[mid] < key)
BinsearchR(arr, mid + 1, end, key);
}
int main()
{
int arr[] = { 2,5,8,9,74,87,96 };
int len = sizeof(arr) / sizeof(int);
cout << BinsearchR(arr,0, len, 2) << endl;
cout << BinsearchR(arr,0, len, 96) << endl;
cout << BinsearchR(arr,0, len, 9) << endl;
cout << BinsearchR(arr,0, len, 74) << endl;
return 0;
}