折分查找法递归和非递归方式
2016-12-18 21:08
302 查看
数据结构期末复习发现忘记了半借鉴写的,比较水有错请务必指正~
废话少说进正题,折半查找也叫二分法使用的前提是待查找数据排列必须有序,最大时间复杂度为O([log2n]+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
废话少说进正题,折半查找也叫二分法使用的前提是待查找数据排列必须有序,最大时间复杂度为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 main 函数
- Lua和C语言的交互详解
- 关于C语言中参数的传值问题
- 简要对比C语言中三个用于退出进程的函数
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C语言中fchdir()函数和rewinddir()函数的使用详解
- 浅谈C语言转义字符和格式控制符
- C语言内存对齐实例详解
- C语言编程中统计输入的行数以及单词个数的方法
- C 语言简单加减乘除运算
- C语言自动生成enum值和名字映射代码
- C语言练习题:自由落体的小球简单实例
- 使用C语言判断英文字符大小写的方法
- c语言实现的带通配符匹配算法
- C语言实现顺序表基本操作汇总
- C语言中进制知识汇总
- C语言判断一个数是否是2的幂次方或4的幂次方
- C语言二进制思想以及数据的存储