求递增数组中绝对值最小的数
思路很简单:
如果数组头尾,不是一负一正,则可以直接判断。
如果是一负一正: 直接二分搜索最小正数。再与前面的那个数比较绝对值。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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));
}
作者: flyinghearts
出处: http://www.cnblogs.com/flyinghearts/
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。