您的位置:首页 > 其它

二分查找 递归实现 和 循环实现

2013-11-12 10:05 302 查看
下面copy了百科对二分算法的描述


二分查找

编辑

二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。


算法要求

必须采用顺序存储结构

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息