您的位置:首页 > 其它

找出有序数组中绝对值最小的元素

2014-08-26 17:56 309 查看
给定一个有序整数序列(非递减序),可能包含负数,找出其中绝对值最小的元素,比如给定序列 -5, -3, -1, 2, 8 则返回-1。

思路:

由于给定序列是有序的,而这又是搜索问题,所以首先想到二分搜索法,只不过这个二分法比普通的二分法稍微麻烦点,可以分为下面几种情况

如果给定的序列中所有的数都是正数,那么数组的第一个元素即是结果。
如果给定的序列中所有的数都是负数,那么数组的最后一个元素即是结果。
如果给定的序列中既有正数又有负数,那么绝对值得最小值一定出现在正数和负数的连接处。

代码如下:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

#define true 1
#define false 0

int SameSign(int a, int b)
{
if (a * b > 0)
return true;
else
return false;
}

// 找出一个非递减序整数序列中绝对值最小的数
int MinimumAbsoluteValue(int* a, int n){
// Only one number in array
if (n == 1)
{
return a[0];
}

// All numbers in array have the same sign
if (SameSign(a[0], a[n-1]))
{
return (a[0]>=0)? a[0] : a[n-1] ;
}

// Binary search
int l = 0 ;
int r = n-1 ;

while(l < r)
{
if (l + 1 == r)
{
return abs(a[l]) < abs(a[r]) ? a[l] : a[r] ;
}

int m = (l + r) /2 ;

if (SameSign(a[m], a[r]))
{
r = m;
}
else
{
l = m ;
}
}
return -1;
}

int main(int argc, const char * argv[])
{
int a[5] = {-3,-2,-1,5,6};
printf("%d\n",MinimumAbsoluteValue(a, 5));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数组 绝对值 最小