二分查找

1.二分查找的分析

       对于查找,今晚上老范将了3中方法,

                    1.顺序查找(数组和链表),但是顺序表的效率不太稳定,不适合大数据,因为要找key值一般都是从遍历数组出发的,平均查找长度ASL=(1+n)/2,最坏时间的复杂度为O(n^2),对于这个我写过,就不写

                     2.二分查找,这是先一定要排好序才可以实现,先拿出中间的值a[mid]和key进行比较,比较之后又三种情况啊,相等,大于,小于。等于直接返回么,没有说的;如果大于的话,直接舍弃前一半,即就是下标low到mid的值,并重新赋值low=mid+1,这样大大的提高了查找的效率,这次可以选择递归和非递归实现,反正两个有共同的特点,结束条件,用非递归的话,只要low<=high就行了,用递归,它的结束条件是low比high大了,然后就返回去,其实递归也是我的硬伤,要好好的思考哩。对于这个时间的复杂度就为O(log2 n);

                    3.散列查找,这次不详细的说了,我会专门弄一个专题来大搞特稿的大笑

2.二分查找的非递归代码

#include<stdio.h>

int halfsearch(int a[],int low,int high,int key)  //非递归实现 
{
	int mid;
	while(low<=high)  // 结束条件是low>high
	{
		mid=(low+high)/2;
		if(a[mid]==key)
			return mid;
		else if(a[mid]<key)  //中间值比要查的值小
			low=mid+1;
		else
			high=mid-1;
	}
	return -1;  //如果没有找到,返回-1
}

int main()
{  
    int a[10]={1,5,9,15,22,27,33,44,68,97};
	int low,high,key,mid;
	low=0;     
	high=10-1;
    printf("请你输入要查找的值: ");
	scanf("%d",&key);
	mid=halfsearch(a,low,high,key);
	if(mid==-1)
	{
       printf("你的输入有误\n");
	}
	else
	  printf("你输入%d是第的位置是%d\n",key,mid+1);


	return 0;
}


 

 

3.二分查找的递归代码

#include<stdio.h>

int  halfsearch(int a[],int low,int high,int key)  // 用递归实现
{
	int mid;
	if(low>high)    //递归出口
		return -1;
	else
	{
         mid=(low+high)/2;
		if(a[mid]==key)   return mid;
		else if(a[mid]<key)
			return  halfsearch(a,mid+1,high,key);
		else
			return   halfsearch(a,low,mid-1,key);
	}
}
int main()
{  
    int a[10]={1,5,9,15,22,27,33,44,68,97};
	int low,high,key,mid;
	low=0;     
	high=10-1;
    printf("请你输入要查找的值: ");
	scanf("%d",&key);
	mid=halfsearch(a,low,high,key);
	if(mid==-1)
	{
       printf("你的输入有误\n");
	}
	else
	  printf("你输入%d是第的位置是%d\n",key,mid+1);


	return 0;
}


 

4.结果演示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值