2.1 二分搜索技术

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

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

【算法要求】
       (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;
}
【运行结果】

2.1 二分搜索技术_第1张图片


你可能感兴趣的:(算法,代码,二分查找,折半查找,二分搜索技术)