折分查找法递归和非递归方式
来源:互联网 发布:幼儿园评估档案软件 编辑:程序博客网 时间: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; }
- 折分查找法递归和非递归方式
- c++二分查找实现(非递归和递归方式)
- c++二分查找实现(非递归和递归方式)
- 二分查找法(递归与非递归方式)
- 二分递归查找和非递归查找
- 递归查找和非递归查找
- (一)算法--查找算法顺序查找和二分查找(递归和非递归方式)
- 对分查找算法(迭代和递归方式)
- 折半查找法的递归和非递归形式
- 二分查找法的递归和非递归实现
- 二分查找法(递归和非递归实现)
- 二分查找递归和非递归实现
- 二分查找算法 递归和非递归
- 二分查找(递归和非递归)
- 递归和非递归的二分查找
- 二分查找递归和非递归实现
- 二分查找递归和非递归实现
- 二分查找递归和非递归
- 数据持久化之文件存储读取
- list 对象去重并排序
- offsetWidth、offsetLeft、clientWidth、clientLeft、scrollWidth、scrollLeft各自特点比较
- Matlab 2015a 安装libsvm 3.21 步骤
- 输入一行字符,分别统计出包含英文字母、空格、数字和其它字符的个数
- 折分查找法递归和非递归方式
- 树莓派3串口(UART)使用问题的解决方法
- Java String、StringBuffer和StringBuilder类以及tcp/ip基础知识总结
- Halcon_Hough变换检测直线,检测圆
- CSS浮动(float)属性的原理以及清除浮动的几种方法
- //1.调整数组使奇数全部都位于偶数前面。 //题目: //输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
- 树梅派应用17:树莓派3如何使用蓝牙
- leetcode 434. Number of Segments in a String
- 基于随机变量的熵来进行数据建模和分析