分治法求递减递增数列最小元素

算法要求:数组元素先严格递减后严格递增,请设计一段尽可能高效的算法找出最小元素。
思路:采用分治的思想。

int FindMin(int Buff[],int start,int end)
{
    if (end==start)
    {
        return Buff[start];
    }


    int mid = (start+end)/2;

    //后半段
    if (Buff[mid]<Buff[mid+1]&&Buff[mid-1]<Buff[mid])
    {
        return FindMin(Buff,start,mid-1);
    } //中间段
    else if (Buff[mid]<Buff[mid+1]&&Buff[mid-1]>Buff[mid])
    {
        return Buff[mid];
    }//前面段
    else if(Buff[mid]>Buff[mid+1]&&Buff[mid-1]>Buff[mid])
    {
        return FindMin(Buff,mid+1,end);
    }
}

以下是python的递归和非递归版本
@print_result_after
def findmin(data):
    start = 0
    end = len(data)
    mid = 0

    while start < end:
        mid = (start + end)//2
        print('{start},{end}:{mid}-{data}'.format(start = start,end = end,mid=mid,data=data[mid]))

        # 同时这里不能是>=,因为只有一个的时候会死循环
        if data[start] > data[mid]:
            # 要保留mid,这里mid可能是最小值,不能是mid+1,比如data=[1,0]
            start = mid
        else:
            # 这里不要mid,mid不可能是最小值
            end = mid

    return data[mid]


def findmin(data,start,end):
    if start > end:
        return False

    if start == end - 1:
        return data[start]

    mid = (start + end) // 2
    if data[start] > data[mid]:
        start = mid
    else:
        end = mid

    return findmin(data,start,end)



最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。