二分查找 递归实现 和 循环实现
2013-11-12 10:05
302 查看
下面copy了百科对二分算法的描述
二分查找
编辑
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
必须采用顺序存储结构
2.必须按关键字大小有序排列。
假设其数组长度为n,其算法复杂度为o(log(n))
编辑
二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
算法要求
必须采用顺序存储结构2.必须按关键字大小有序排列。
算法复杂度
假设其数组长度为n,其算法复杂度为o(log(n))下面是我自己对二分的理解 如有错误请指出我将感激不尽 欢迎讨论
二分算法不只是能用在数组上 只要数据是有序的(如果是无序的话就要我们通过排序来实现二分查找 没办法二分查找必须有序啊) 我们都可以通过二分查找的方法来查找我们需要的信息是否存在
二分算法总体上有两种写法 一种是迭代 一种是循环 看代码#include<cstdio> #include<cstring> #include<algorithm> using namespace std; /*int BinarySearch(int *s,int l, int r, int x)//非迭代写法 { while(l <= r) { int m = l + (r-l)/2; if(s[m] == x) return m; else if(s[m] > x) r = m; else l = m+1; printf("l = %d r = %d\n",l,r); } return -2; }*/ int BinarySearch(int *s,int l, int r, int x)//迭代写法 { if(l > r)return -2; int m = l + (r-l)/2; if(s[m] == x)return m; else if(s[m] > x) BinarySearch(s,l,m,x); else BinarySearch(s,m+1,r,x); } int main() { int N; while(scanf("%d",&N)!=EOF) { int T ; for(int i = 0; i < N; i++) scanf("%d",&T[i]); sort(T,T+N);//二分查找先排序 O(NlgN) 二分 O(lgN); int x; while(scanf("%d",&x)) { if(x == -1)break; printf("%d\n\n",BinarySearch(T,0,N-1,x)+1); } } return 0; }
相关文章推荐
- 二分查找的两种实现(循环与递归)
- 二分查找的两种实现方式--循环和递归
- 二分查找算法的递归、循环实现及其缺陷
- 二分查找的循环实现和递归实现
- 《算法导论》第二章----插入排序(伪代码实现、课后习题(递归版本、二分查找策略版本))
- 二分查找递归实现--【编程珠玑】
- 二分查找的递归和非递归实现
- c语言利用递归实现二分查找
- 二分查找----递归实现
- 二分搜索的递归和循环实现
- 二分查找算法原理及其java循环实现
- PHP递归与非递归实现二分查找
- M--二分查找 递归实现
- 漫谈递归:二分查找算法的递归实现
- Java实现折半查找(二分查找)的递归和非递归算法
- 递归实现二分查找
- 用递归实现的二分查找
- C语言 ---- 递归实现二分查找
- 二分查找的尾递归和循环形式的分析
- 二分查找的递归和非递归实现