折半查找,又称二分查找,仅适用于有序顺序表的查找。以下以基本数据类型的数组为例进行原理介绍和代码编写。
1 算法基本思路
算法基本思路如下,
【1】首先将给定值key与顺序表的中间位置元素的值进行比较,若相等,则查找成功,返回该元素的存储位置;若不等,则所需查找的元素只能在中间元素之前或者之后;
【2】通过修改查找的起止范围,在目标范围内执行【1】中的查找,如此重复直到查找到key值为止;若查找失败,则返回错误信息。
2 核心代码编写
/**
* 折半查找-[返回目标元素下标,找不到则返回-1]
*/
int binarySearch(int* arr,int len,int val){
int low=0,high=len-1,mid;
while (low<=high)//当low>high时终止
{
mid=(low+high)/2;
if (arr[mid]==val)
return mid;//找到-返回元素下标值
else if (arr[mid]<val)
{
low=mid+1;//目标值大于中间值-位于中间位置右侧
}else{
high=mid-1;//目标值小于中间值-位于中间位置左侧
}
}
return -1;//未找到-返回-1
}
3 查找测试
#include <iostream>
using namespace std;
//数组定义
int arr[11]={7,10,13,16,19,29,32,33,37,41,43};
/**
* 折半查找-[返回目标元素下标,找不到则返回-1]
*/
int binarySearch(int* arr,int len,int val);
//main函数
int main(int argc,char** argv){
std::cout<<binarySearch(arr,11,19)<<std::endl;
return 0;
}