知识点讲解
一、没有相同元素查找
请在一个有序递增数组中(不存在相同元素),采用二分查找,找出值x的位置,如果x在数组中不存在,请输出-1!
输入格式
第一行,一个整数n,代表数组元素个数(n <= 600000)
第二行,n个数,代表数组的n个递增元素(1<=数组元素值<=2000000)
第三行,一个整数x,代表要查找的数(0<=x<=2000000)
输出格式
按题意输出位置或者-1。
输入/输出例子1
输入:
10
1 3 5 7 9 11 13 15 17 19
3
输出:
2
【分析】:当我们要从一个序列中查找一个元素的时候,最快想到的方法就是顺序查找法(即:从前到后依次查找)。但这种方法过于无脑,就是暴力的把每个元素都排查一遍。元素个数少的时候还行,一旦元素个数多起来,效率非常低下。
分查找法也称折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log2n)完成查找任务。
它的基本思想是,先把n个元素从小到大排序,然后取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如果x<a[n/2],则我们只要在数组a的左半部分继续搜索x。如果x>a[n/2],则我们只要在数组a的右半部分继续搜索x,直到查找成功或查找完毕为止。
以下是二分查找的查找过程图示:


二分查找的算法框架一如下:
left=1;right=n;
while(left<=right)
{
mid=(left+right) / 2;
if (x==a[mid]){ printf("%d",mid)}//查找成功,输出mid的值并结束;
if (x>a[mid]) left=mid+1;//往数组的右边找
if (x<a[mid]) right=mid-1;//往数组的左边找
}
printf("查找不成功")//输出“查找不成功”
在查找过程中我们每次把查找的范围缩小了一半,在最坏情况下查找log2n次就可以得到结果。
注意:
1.二分查找是在数据有序的情况下才能完成,即进行二分查找前数据必须先排序。上述框架是以数据已从小到大排序为前提条件的。
2.这里可能解的范围为[left,rigth],当x>a[mid]时,x如果存在的话应该是在数组的[mid+1,right]中,此时的left改为mid+1,而不是mid;同理,当x<a[mid]时,x如果存在的话应该在数组的[left,mid-1]里,此时的right应该改为mid-1,而不是mid。

本文详细介绍了二分查找算法的基本原理、两种查找边界的方法,以及如何在有序数组中查找特定值,包括无相同元素和存在相同元素的情况。同时提供了C++代码示例和实际问题应用,如铁人三项运动员游泳训练和游戏竞技中的战斗力匹配问题。

1305

被折叠的 条评论
为什么被折叠?



