循环有序数组的二分查找

本文介绍了如何在循环有序数组中使用二分查找算法寻找指定元素。首先确定临界点,通过比较数组不同位置的元素来判断单调性。然后根据目标元素与中间元素的关系,决定在数组的哪一侧继续搜索。最后,通过比较边界元素来确定目标元素是否在单调递增部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:请实现以下函数int indexOf(int [] array ,int key) ,给定一个循环有序的数组,请在这个数组中找到指定元素,找到的话返回下标,没找到返回-1。:

解决:首先,使用二分查找找到数组的 “临界点”,临界点满足两个情况:

  1. array[left] < array[mid]
  2. array[left] <= array[mid]
    只有确定分界点,确定了key的范围,才能找到key的位置.

如何判断一段数组是单调递增呢?在该段数组的头、中间、尾三个位置p,m,q取三个值a[p], a[m], a[q],如果是单调递增则一定满足 a[p] >= a[m] >= a[q],否则则非单调递增。
判断目标元素下一步所在区间,有几种情况:
当 x > a[m] 时,
右半边是单调递增区间,并且x在此区间内,下一步则可在此右半边区间内查找
右半边是单调递增区间,并且x不在此区间内,下一步在左半边查找
右半边是非单调递增区间,则x必然在此区间内,下一步在右半边查找
当 x < a[m] 时, 同理类似
左半边是单调递增区间,并且x在此区间内,下一步则可在此左半边区间内查找
左半边是单调递增区间,并且x不在此区间内,下一步在右半边查找
左半边是非单调递增区间,则x必然在此区间内,下一步在左半边查找
判断是否在单调递增部分,只需与区间的另外一头的元素比较一下大小即可知道

public class Test{
	public static int Cycle(int []arry,int k){
		int l=0;
		int r=arry.length;
		while(l<r){
			int mid=(l+r)/2;
			if(arry[mid]==k){
				return mid;
			}
			if(arry[l]<arry[mid]){
				if(k>arry[l]&&k<arry[mid]){
					r=mid-1;
				}
				el
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值