介绍
折半查找,又称作二分查找。这个查找的算法的特点,就是,要求数据要是有序的。
1 ,存储结构一定是顺序存储
2 ,关键字大小必须有序排列
然后,利用这组有序的数据之间的关系,来进行折半的查找。
比方说,这组数据是升序排列的。一开始,首先对比这组数据的中间的项与关键值(key)的关系。若是关键值(key)>中间值,则说明,关键值(key)在中间值的右侧,因此将这组数据的区间缩小为以中间值为最左侧的小区间。然后,继续用中间值进行比较,以此类推,最终肯定会找到在数组当中与之匹配的关键值,直到区间缩小为0还没找到,就只能是关键值(key)不在数组当中
算法分析
折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
二分查找的基本思想是将n个元素分成大致相等的两部分,取a[n/2]与x做比较,如果x=a[n/2],则找到x,算法中止。如果x< a[n/2],则只要在数组a的左半部分继续搜索x,如果x>a[n/2],则只要在数组a的右半部搜索x。一直这样搜索下去,时间复杂度为O(log N)
代码实现
/折半查找
void binarySearch(int *arr,int length,int key) {
//数组左端
int left = 0;
//数组右端
int right = length - 1;
//中间
int mid;
//在左右指针交换之前,查找还没结束
while (left <= right) {
//更新中间的值
mid = (left + right) / 2;
//查找成功
if (arr[mid] == key) {
cout << "find it and its index is " << mid;
return;
}
//若还没有找到,改变左右区间继续寻找
if (arr[mid] < key)
left = mid + 1;
if (arr[mid] > key)
right = mid - 1;
}
cout << "cannot find it" << endl;
return;
}