用二分搜索搜索数组的最大值(c)

时间:2018-03-10 12:02:27

标签: c binary-search

编写一个接收非负数a数组的函数,其大小为n

数组从低到高的数字排序,所有这些数字都计为t。数组(n-t)的其余部分包括零。

例如:

对于数组{1,5,5,7,8,0,0,0} (t=5),函数返回8

对于数组{2,4,5,6,6,8,9,9} t=8,函数返回9

对于数组{0,0,0,0,0,0,0,0} t=0等等..

O(log(n))

的运行时任务很简单
int max_seq(int *a, int n)
{
    int low = 0, high = n - 1, mid;
    if (a[0] == 0) return 0; //a[n] = {0};
    while (high > low)
    {
        mid = (high + low) / 2;
        if (a[mid] == 0) // value is zero
            high = mid - 1;
        else //value is positive number
            if (a[mid + 1] == 0) //next number is zero
                return a[mid];
            else // next number is positive number
                low = mid + 1;
    }
    if (high == low)
        return a[low];
}

但问题是,如何使用(log(t))的运行时运行程序? (虽然t未知)

1 个答案:

答案 0 :(得分:0)

在进行分而治之之前,您可以从数组的开头搜索lowhigh的更优化初始值,并在每次迭代中将索引加倍:

while(1) {
    if(high >= (n - 1)) {
        high = n - 1;
        break;
    }
    if(a[high] == 0)
        break;
    low = high;
    high *= 2;
}