不使用排序算法或矢量/数组的五个最大参数的平均值

时间:2017-06-08 20:56:56

标签: c++ arrays algorithm sorting average

我正在尝试创建一个具有5个输入参数的函数,并返回3个最大值的平均值。但是,我不应该使用排序算法,矢量/数组或函数库,并且仍然尝试使用它来开发最有效的逻辑。

到目前为止,我已经提出了以下代码。考虑到这些限制,它是否是最有效的?

float avg3of5(float a, float b, float c, float d, float e) {                                          
    float min;
    float min2;

    min = a;
    if (b < min) {
        min2 = min;
        min = b;
    }
    else {
    min2 = b;
    }

    if (c < min) {
        min2 = min;
        min = c;
    }
    else {
        if (c < min2) {
            min2 = c;
        }
    }

    if (d < min) {
        min2 = min;
        min = d;
    }
    else {
        if (d < min2) {
            min2 = d;
        }
    }

    if (e < min) {
        min2 = min;
        min = e;
    }
    else {
        if (e < min2) {
            min2 = e;
        }
    }

    Return = (a + b + c + d + e - min - min2) / 3
}

1 个答案:

答案 0 :(得分:-1)

立即跳出来的一件事是由以下原因造成的重复:

if (b < min) {
    min2 = min;
    min = b;
}
else {
    min2 = b;
}

将此逻辑提取到函数中然后再调用它可能更好:

#include <iostream>

float avg3of5(const float, const float, const float, const float, const float);
void adjustmins(const float, float*, float*);

int main()
{
    std::cout << avg3of5(4,6,2,6,3);
}

float avg3of5(const float a, const float b, const float c, const float d, const float e){                                          
    float min;
    float min2;

    min = a;

    adjustmins(b, &min, &min2);
    adjustmins(c, &min, &min2);
    adjustmins(d, &min, &min2);
    adjustmins(e, &min, &min2);

    return (a + b + c + d + e - min - min2) / 3;
}

void adjustmins(const float n, float* min, float* min2){
    if (n < *min) {
        *min2 = *min;
        *min = n;
    }
    else {
        *min2 = n;
    }
}

我无法告诉你,这在处理时间方面是否更有效,但重复次数要少得多。

如果你更喜欢使用引用而不是指针,请使用它(仅限C ++):

void adjustmins(const float, float&, float&);

void adjustmins(const float n, float& min, float& min2){
    if (n < min) {
        min2 = min;
        min = n;
    }
    else {
        min2 = n;
    }
}

然后致电:

adjustmins(b, min, min2);