二分查找

二分查找算法(C语言)

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

#include<stdio.h>
#define N 1000
void sort(int a[],int n)
{
	int i,j,t;
	for(i=1;i<n;i++)
		for(j=0;j<n-i;j++)
			if(a[j]>a[j+1])
			{
				t=a[j];
				a[j]=a[j+1];
				a[j+1]=t;
			}
}/*由于此算法是基于有序表的,所以需要先对输入的数据
排序,这里使用冒泡排序法对数据进行升序排序。*/
int search(int a[],int num,int n)
{
	int result=-1;//设置返回值
	int left,right,middle;
	left=0;
	right=n-1;//设定查找范围,即下标
	while(left<=right)//结束标志:左端下标大于右端下标
	{
		middle=(left+right)/2;//先比较中间的数与给定的数
		if(a[middle]==num)
		{
			result=middle;
			break;
		}//若中间的数正好与给定数相等,就结束循环
		else if(a[middle]>num)
			right=middle-1;/*若中间的数大于给定的数,则说
明给定的数在排序后表的左端,查找范围就变成表的左端,即右端点变为中间端点*/
		else if(a[middle]<num)
			left=middle+1;
	}//与上面相反
	return result;//返回在排序后序列里的序号
}
int main()
{
	int a[N],n,x,i,result;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	scanf("%d",&x);
	sort(a,n);
	result=search(a,x,n);
	if(result==-1)
		printf("未找到该数。");
	else
		printf("找到该数。");//简化后的输出
	return 0;
}

二分查找算法的时间复杂度为O(log₂n).

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值