Algorithm 在旋转N次的数组中搜索元素

Algorithm 在旋转N次的数组中搜索元素,algorithm,Algorithm,我有一个排序数组,它旋转了n次,n是未知的。现在我想用O(nlogn)中的二进制搜索来搜索一个元素。我实现了下面的代码,效果很好。 但我认为条件if((end-start)==1)可以通过做一些修改来跳过, 有人能建议吗 Eg of array 1 2 3 4 5 2 3 4 5 1 //rotated once 代码: public static int srch(int a[],int start,int end,int key){ 如果(开始>结束) 返回-1;

我有一个排序数组,它旋转了n次,n是未知的。现在我想用O(nlogn)中的二进制搜索来搜索一个元素。我实现了下面的代码,效果很好。 但我认为条件if((end-start)==1)可以通过做一些修改来跳过, 有人能建议吗

Eg of array 1 2 3 4 5 
            2 3 4 5 1 //rotated once
代码:

public static int srch(int a[],int start,int end,int key){
如果(开始>结束)
返回-1;
如果((结束-开始)==1){
如果(键==a[开始])
返回启动;
else if(key==a[end])
返回端;
其他的
返回-1;
}
int mid=(开始+结束)/2;
如果(a[mid]==键){
中途返回;
}
否则{
if(a[开始]a[mid]|键a[mid]){
开始=中间+1;
}否则{
end=mid-1;
}
}
返回srch(a、开始、结束、键);
}
}

有更好/更简单/更高效的解决方案吗?

您的解决方案正在O(日志n)中运行,因此没有更高效的解决方案。也许您的部分代码可以优化,但这不会影响O的运行时间。正如您所说,代码可以工作并返回正确的值,因此我认为这是您面试问题的正确答案。

我还没有彻底检查您的代码的正确性,但您的解决方案是O(log n)。从算法上讲,您无法找到更好的解决方案。

对于数组{4,5,1,2,3}和key=4,您的解决方案将失败。 我认为第二部分的修改将解决这个问题

else{
            //second half is sorted

            if(key>a[mid] && key<=a[end]){// modified condition
                start= mid+1;
            }else{
                end =mid-1;
            }
else{
//下半部分已排序
如果(键>a[mid]&&keyend)
返回-1;
int mid=(开始+结束)/2;
如果(a[mid]==键){
中途返回;
}
否则{
if(a[开始]如果(key>a[mid]| | key a[mid]&&key我想你的意思是O(logn)而不是O(n logn),你的缩进是不对的:\n你的帖子似乎是重复的:可能是重复的
else{
            //second half is sorted

            if(key>a[mid] && key<=a[end]){// modified condition
                start= mid+1;
            }else{
                end =mid-1;
            }
public static int srch(int a[],int start,int end,int key){
    if(start>end)
        return -1;

     int mid = (start+end)/2;

    if(a[mid]== key){
        return mid;
    }
    else{
        if(a[start] < a[mid] ){
            //first half is sorted
            if(key>a[mid]|| key <a[start]){
                start= mid+1;
            }else{
                end =mid-1;
            }
        }else{
            //second half is sorted

            if(key>a[mid] && key<=a[high]){
                start= mid+1;
            }else{
                end =mid-1;
            }
        }
        return srch(a, start, end, key);
    }
}