1.查找过程
首先,假设数列是递增的。查找时,先查找中间的数,若待差的数与中间的数相等,则查找成功;若待查的数比中间的数小,则到数组的前半部分查找;否则待查数比中间数大,则到数组的后半部分查找。以同样的方法在选定的区域中进行查找,每次都会将查找范围缩小一半,较快便能找到目的数。直到将查找区域缩小为0,如果找到了要查找的数,则查找成功,否则查找失败,表明有序数列中没有要查找的数。
2.算法要求
数列必须单调递增或单调递减。
3.示例
在有序数列(11,22,33,44,55,66,77,88,99)中查找66。
解答
用折半查找(二分查找)法要用到3个游标变量:front,tail和mid。其中front和tail分别指示被查找区域的头尾位置,以此公式mid =(front + tail)/2来确定每次查找区域的中间位置。
流程图
图解
代码实现
#include<iostream>
using namespace std;
/*折半查找*/
int binsearch(int x,int arr[],int n)
{
int front = 0,tail = n-1,mid;
while(front <= tail)
{
mid = (front + tail)/2;
if(x < arr[mid])
tail = mid - 1;
else
if(x > arr[mid])
front = mid + 1;
else
return mid;
}
return -1;
}
int main()
{
int index,elem;
int data[9] = {11,22,33,44,55,66,77,88,99};
cin>>elem;
index = binsearch(elem,data,9);
if(index >= 0)
cout<<"要查找的数在数组中位置:"<<index<<endl;
else
cout<<"查无此数"<<endl;
return 0;
}
4.时间复杂度
T(n) = O(㏒2n)(以2为底,n的对数)