这个问题在这里已有答案:
我已经尝试了以下代码来找出循环排序数组中的最小元素 . 但是当low = 1和high = 2时它会失败,因为mid总是1而且[mid] = a [1]总是大于a [high] .
我想在这里使用二进制搜索来找到解决方案 .
//finding the minim element in the cyclic sorted array
int arrC[]={10,13,1,3,4,5,8};
int low=0,high =6;
int mid=0,reset =1;
while (low < high)
{
mid = (low+ high)/2;
if (arrC[mid]>arrC[high])
{
low = mid;
}
else if (arrC[mid] < arrC[high])
{
high = mid;
}
}
printf("minimum element is %d",arrC[mid+1]);
3 回答
使用普通二进制搜索,但如果
arrC[high] < arrC[low]
,则将arrC[high]
视为无穷大以考虑环绕 . 要做到这一点,只需更改行:至:
您的代码有2个问题
正如Paulpro所指出的那样......将arrC [high]视为无穷大......
除此之外,我还建议你使用
不要使用
(low+high)/2
. 这可能导致总和超过整数限制,并将导致负值 . 您的代码失败的另一个原因 .注意:如果因为无法轻松确定要搜索的方向,则只有在有序数据中包含相同值时才能将搜索范围减半 . 但是如果不包括相同的值,则有可能 .