您的位置:首页 > 编程语言 > C语言/C++

折分查找法递归和非递归方式

2016-12-18 21:08 302 查看
数据结构期末复习发现忘记了半借鉴写的,比较水有错请务必指正~

废话少说进正题,折半查找也叫二分法使用的前提是待查找数据排列必须有序,最大时间复杂度为O([log2n]+1)

算法理解

1) 待查找数据值与中间元素值正好相等,则放回中间元素值的索引。

2) 待查找数据值比中间元素值小,则以整个查找范围的前半部分作为新的查找范围,执行1),直到找到相等的值。

3) 待查找数据值比中间元素值大,则以整个查找范围的后半部分作为新的查找范围,执行1),直到找到相等的值

4) 如果最后找不到相等的值,则返回错误提示信息。

因此,这个算法的结束标志有两种,一种找到目标值,标志为e==data[mid],另一种是找不到数据,标志为beg>end,即数据的查找范围结果多次夹逼变为空集。参考toddhan的对应的博客,可以将查找方式看作是二叉树,中间值为二叉树的根,前半部分为左子树,后半部分为右子树。折半查找法的查找次数正好为该值所在的层数。

eg.有一个有序表为{1,3,9,12,32,41,45,62,75,77,82,95,100},当折半查找值为82的结点时,()次比较后查找成功。



初始beg=0 last=12 mid=(beg+last)/2=6 data[mid]=45

①82>45 beg=mid+1=7 last=12 mid=(beg+last)/2=9(C中整型算法默认整除)

②82>data[mid]=77 beg=mid+1=10 last=12 mid=(beg+last)/2=11

③82< data[mid]=95 beg=10 last=mid-1=10 mid=(beg+last)/2=10

④82==data[mid] 得到结果

故正确答案是4

代码部分

//非递归算法
int BiSearch(int data[], const int x, int beg, int last)
{
int mid;//中间
while(beg <= last)
{
mid = (beg + last) / 2;
if (x == data[mid] )
{
return mid;
}
else if (data[mid] < x)
{
beg = mid + 1;
}
else if (data[mid] > x)
{
last = mid - 1;
}
}
return -1;
}


//递归算法
int IterBiSearch(int data[], const int x, int beg, int last)
{
int mid = -1;
mid = (beg + last) / 2;
if (x == data[mid])
{
return mid;
}
else if(beg>last)
{
return -1;
}
else if (x < data[mid])
{
return IterBiSearch(data, x, beg, mid - 1);
}
else if (x > data[mid])
{
return IterBiSearch(data, x, mid + 1, last);
}
return -1;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息