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

来源:互联网 发布:幼儿园评估档案软件 编辑:程序博客网 时间:2024/04/29 19:05

数据结构期末复习发现忘记了半借鉴写的,比较水有错请务必指正~
废话少说进正题,折半查找也叫二分法使用的前提是待查找数据排列必须有序,最大时间复杂度为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;  }  
1 0
原创粉丝点击