查找算法之折半查找(二分查找)

1.用折半查找的必须是有序的(即已经排好序的)

2.优点:比较次数少,查找速度块

3.缺点:要求待查表为有序表,而且插入困难

4.适用于 不经常变动而且要频繁查找的有序表


折半查找可以用2种方法实现,分别是 循环 和 递归。

#include<stdio.h>

/*-----------循环实现二分法-------------------*/
int binarysearch(int a[],int key,int len)
{
	int middle;
	int low = 0;
	int high = len-1;
	while(low<=high)
	{
		middle = (low+high)/2;
		if(a[middle]==key)
			return middle;
		if(a[middle]>key)
			high = middle-1;
		if(a[middle]<key)
			low = middle+1;
		
	}
	return -1;
}
/*------------------------------------------*/
int main()
{
	int arr[]={1,2,12,21,45,65};
	int re;
	re = binarysearch(arr,21,sizeof(arr)/sizeof(int));	
	printf("%d",re);		//打印结果:3 (返回的是key在数组中的位置)
	return 0;
}

下图的是递归方法,个人不推荐用递归因为传递的参数比较多且理解起来没while循环容易

#include<stdio.h>

int binarysearch(int a[],int key,int low,int high)
{
	int middle;
//	printf("low=%d,high=%d\n",low,high);
	middle = (low+high)/2;
//	printf("middle=%d\n",middle);
//	printf("a[middle]=%d\n",a[middle]);
	if(a[middle]==key)
	{ 
//		printf("OK\n"); 
		return middle;
	}
	 
	if(middle == low||middle == high)
	{
		
		if(a[low]==key)
			return low;
		if(a[high]==key)
			return high;
		else
	//		printf("return -1\n");
			return -1;
	}
	
	if(a[middle]>key)
	{
//		printf("a[middle]>key\n");
		return binarysearch(a,key,low,middle);
	}
	
	if(a[middle]<key)
	{ 
//		printf("a[middle]<key\n");
		return binarysearch(a,key,middle,high);	
	} 
}

int main()
{
	int a[]={0,11,23,34,44,59};
	int b=binarysearch(a,34,0,5);
	printf("b=%d\n",b);
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值