思路很简单:
如果数组头尾,不是一负一正,则可以直接判断。
如果是一负一正: 直接二分搜索最小正数。再与前面的那个数比较绝对值。
#include<cstdio>
#include<cassert>
//从递增数组(允许重复)中找出绝对值最小的数
int bsearch(const int arr[], size_t len)
{
assert(len > 0);
const size_t end = len - 1;
if (arr[0] >= 0) return arr[0];
if (arr[end] <= 0) return arr[end];
size_t low = 0, high = end;
while (low < high) { //找出大于0的最小数
size_t mid = low + (high - low) / 2u;
if (arr[mid] <= 0) low = mid + 1;
else high = mid;
}
if (arr[low] > -arr[low - 1]) return arr[low - 1];
return arr[low];
}
int main()
{
int arr[] = {-5, -3, -1, 0, 1,2, 8 };
const int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", bsearch(arr, sz));
}
#include<cassert>
//从递增数组(允许重复)中找出绝对值最小的数
int bsearch(const int arr[], size_t len)
{
assert(len > 0);
const size_t end = len - 1;
if (arr[0] >= 0) return arr[0];
if (arr[end] <= 0) return arr[end];
size_t low = 0, high = end;
while (low < high) { //找出大于0的最小数
size_t mid = low + (high - low) / 2u;
if (arr[mid] <= 0) low = mid + 1;
else high = mid;
}
if (arr[low] > -arr[low - 1]) return arr[low - 1];
return arr[low];
}
int main()
{
int arr[] = {-5, -3, -1, 0, 1,2, 8 };
const int sz = sizeof(arr) / sizeof(arr[0]);
printf("%d\n", bsearch(arr, sz));
}