二分查找
二分查找,又名折半查找,在有序数组中查找元素的效率很高;缺点就是只能查询有序表,因此适用于不用频繁插入删除的有序表
如果没有二分查找,通过遍历来查询表中元素的时间复杂度为O(N)
而二分查找时间复杂度为O(lgN)
以非递归的形式实现二分查找
//二分查找的非递归形式
int BinaryResearchNonR(int *arr,int left, int right, int key)
{
while (left <= right)
{
int mid = left&right + ((left ^ right) >> 1);
if (arr[mid] > key)
{
right = mid - 1;
}
else if (arr[mid] < key)
{
left = mid + 1;
}
else
{
return mid;
}
}
//没有找到,返回-1
return -1;
}
以递归的形式实现二分查找
//二分查找的递归形式
int BinaryResearch(int* arr, int left, int right, int& key)//这里我们传入引用,避免了值传递的拷贝过程
{
if (right < left)
return -1;
//求平均值,相同位加上不同位的一半就是整体的一半
int mid = (left&right) + ((left^right) >> 1);
if (arr[mid] > key)
{
return BinaryResearch(arr, left, mid - 1, key);
}
else if (arr[mid] < key)
{
return BinaryResearch(arr, mid + 1, right, key);
}
else
{
return mid;
}
//没有找到,返回-1
return -1;
}
测试函数
void TestBinartResearch()
{
int arr[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
int key = 9;
int ret = BinaryResearch(arr, 0, 9, key);
cout << ret << endl;
}