折半查找法的递归和非递归形式
2015-06-01 11:30
267 查看
/*
1、折半查找的查找过程是:先确定待查记录所在区间,然后逐步缩小范围至到找到或者找不到该记录为止。
2、折半查找的性能分析可以由判定树得出,折半查找在查找成功时给定值进行比较的关键字个数至多为⌊log_2 ⌋
*/
//折半查找法的非递归形式
int Search_Bin ( SSTable ST, KeyType kval ) {
low = 1; high = ST.length; // 置区间初值
while (low <= high) {
mid = (low + high) / 2;
if ( kval == ST.elem[mid].key )
return mid; // 找到待查元素
else if ( kval < ST.elem[mid].key) )
high = mid - 1; // 继续在前半区间进行查找
else low = mid + 1; // 继续在后半区间进行查找
}
return 0;
}
//折半查找法的递归形式
int b_search(int elem[], int low, int high, int kval)
//在数组elem的下标范围为low~high(low>0)中查找kval,若查不到则返回0.
{
int mid;
if(low>high)
return -1;
else{
mid = (low+high) / 2;
if(elem[mid]==kval)
return mid;
if(kval>elem[mid])
return b_search(elem,mid+1,high,kval); /*在序列的后半部分查找*/
else
return b_search(elem,low,mid-1,kval); /*在序列的前半部分查找*/
}
}
1、折半查找的查找过程是:先确定待查记录所在区间,然后逐步缩小范围至到找到或者找不到该记录为止。
2、折半查找的性能分析可以由判定树得出,折半查找在查找成功时给定值进行比较的关键字个数至多为⌊log_2 ⌋
*/
//折半查找法的非递归形式
int Search_Bin ( SSTable ST, KeyType kval ) {
low = 1; high = ST.length; // 置区间初值
while (low <= high) {
mid = (low + high) / 2;
if ( kval == ST.elem[mid].key )
return mid; // 找到待查元素
else if ( kval < ST.elem[mid].key) )
high = mid - 1; // 继续在前半区间进行查找
else low = mid + 1; // 继续在后半区间进行查找
}
return 0;
}
//折半查找法的递归形式
int b_search(int elem[], int low, int high, int kval)
//在数组elem的下标范围为low~high(low>0)中查找kval,若查不到则返回0.
{
int mid;
if(low>high)
return -1;
else{
mid = (low+high) / 2;
if(elem[mid]==kval)
return mid;
if(kval>elem[mid])
return b_search(elem,mid+1,high,kval); /*在序列的后半部分查找*/
else
return b_search(elem,low,mid-1,kval); /*在序列的前半部分查找*/
}
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua和C语言的交互详解
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(七):数据结构详解
- Lua教程(二):C++和Lua相互传递数据示例
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构揭秘一
- C++联合体转换成C#结构的实现方法
- 关于C语言中参数的传值问题
- 深入C++中API的问题详解
- 基于C语言string函数的详解
- C++编写简单的打靶游戏
- C语言内存对齐实例详解
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结