2.1 二分搜索技术

二分查找,又称折半查找,是一种高效的查找方法,适用于有序列表。它通过不断将查找区间减半来快速定位目标元素。在查找过程中,每次比较中间元素,根据比较结果缩小查找范围。这种方法在查找成功时具有较少的比较次数,但在插入和删除操作时存在挑战,因为需要保持列表有序。算法要求列表按关键字升序排列并使用顺序存储结构。
摘要由CSDN通过智能技术生成

       二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表

      【思想】:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功

【算法要求】
       (1)必须采用顺序存储结构        ( 2)必须按关键字大小有序排列。

【算法分析】
         (1) 该问题可以分解为若干个规模较小的相同问题;
         (2)分解出的子问题的解可以合并为原问题的解;
         (3)分解出的各个子问题是相互独立的。
         (4)该问题的规模缩小到一定的程度就可以容易地解决;
【算法复杂度】:假设其数组长度为n,其算法复杂度为o(logn)


据此容易设计出二分搜索算法

template<class Type> 
int BinarySearch(Type a[], const Type& x, int l, int r)
{
     while (r >= l){ 
        int m = (l+r)/2;
        if (x == a[m]) return m;
        if (x < a[m]) r = m-1; else l = m+1;
        }
    return -1;
} 

【C语言实现代码】

#include<stdio.h>
#define N 10
int main()
{
	int i,j,t,a[N];
	int find;
	printf("Please input %d numbers into a array\n",N);
	for(i=0;i<N;i++) //接收数组元素
		scanf("%d",&a[i]);
	for(i=0;i<N-1;i++) 
		for(j=i+1;j<N;j++)
			if(a[i]>a[j])
			{
				t=a[i];
				a[i]=a[j];
				a[j]=t;
			}
	printf("The array is:\n");
	for(i=0;i<N;i++)
		printf("a[%d]=%d ",i,a[i]);
	printf("\nPlease input you want to find value:");
    scanf("%d",&find);
	int left=0;
	int right=N-1;
    int flag=0,mid;
	while(left<=right)
	{
		mid=(left+right)/2;
		if(mid==find) 
		{
			flag=1;
			break;
		}
		else if(find>mid)
			left=mid+1;
		else 
			right=mid-1;
	}
	if(flag)
		printf("The value found at:a[%d]=%d\n",mid,a[mid]);
	else
		printf("The value is not found!\n");
	return 0;
}
【运行结果】



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值