排序三个项目的数组

时间:2013-09-24 21:52:05

标签: c++

我正在尝试编写一个输入特定销售额的程序,并根据三个支付率计划进行一些计算。我想提出的一件事是找出三个计划的中位数的方法。因此,如果plan1 = 200,plan2 = 250,plan3 = 300,我希望计算机知道中位数是250.如果有人可以帮助我使用算法或预先构建的函数,我将非常感激。< / p>

3 个答案:

答案 0 :(得分:3)

int ra[3] = { plan1, plan2, plan3 };
std::sort(ra, ra+3);
return ra[1];

可能更有效率地完成 - 如果您真的很幸运,编译器可能为您优化它。

“应该”效率更高的代码可能会更长,例如:

if (plan1 < plan2) {
    if (plan2 < plan3) return plan2;
    // plan2 is the biggest
    return max(plan1, plan3);
} else {
    if (plan1 < plan3) return plan1;
    // plan1 is the biggest
    return max(plan2, plan3);
}

另一种可能性:

void order(int &first, int &second) {
    if (second < first) std::swap(first, second);
}

order(plan1, plan2);
order(plan2, plan3);
order(plan1, plan2);
return plan2;

答案 1 :(得分:0)

int median(int plan1, int plan2, int plan3) {
  if (plan1 <= plan2 && plan1 >= plan3 || plan1 <= plan3 && plan1 >= plan2) return plan1;
  if (plan2 <= plan1 && plan2 >= plan3 || plan2 <= plan3 && plan2 >= plan1) return plan2;
  return plan3;
}

答案 2 :(得分:0)

这会变得混乱,但它可能会帮助您思考算法。

如何订购三个号码?首先比较其中两个,然后比较第三个,直到你知道它放在哪里。这将需要很多if语句,但会向您显示基本算法。 (您也可以使用各种排序函数,但由于您只有三个元素,因此值得思考)

int findMedian(int num1, int num2, int num3) {
    if (num1 < num2) {
        if (num2 < num3) {
            // the order is then num1, num2, num3
            return num2;
        } else {
            // We know num1 is < num2 and num3 is < num2, but don't know 
            // where num1 and num3 go: num1, num3, num2 or num3, num1, num2?
            if (num1 < num3) {
                // now we know: num1, num3, num2
                return num3;
            } else {
                // num3, num1, num2
                return num1;
            }
        }
    } else {
        if (num2 < num3) {
             // We know num2 < num1 and num2 < num3, but don't know where num1
             // and num3 go: num2, num1, num3 or num2, num3, num1?
             if (num1 < num3) {
                 // now we know: num2, num1, num3
                 return num1;
             } else {
                 // num2, num3, num1;
                 return num3;
             }
        } else {
             // We know num2 < num1 and num3 < num2, so num3, num2, num1
             return num2;
        }
    }
}

能够思考算法可以流动的所有路径是一个很好的练习,这证明了这个过程。一旦掌握了逻辑,如果您愿意,可以使用三元运算符使其更简洁(并删除​​注释):

int findMedian(int num1, int num2, int num3) {
    if (num1 < num2) {
        if (num2 < num3) {
            return num2;
        } else {
            return (num1 < num3) ? num3 : num1;
        }
    } else {
        if (num2 < num3) {
             return (num1 < num3) ? num1 : num3;
        } else {
             return num2;
        }
    }
}

如果我们想牺牲可读性,我们可以进一步压缩它:

int findMedian(int num1, int num2, int num3) {
    if (num1 < num2) {
        return (num2 < num3) ? num2 : (num1 < num3) ? num3 : num1;
    } else {
        return (num2 < num3) ? (num1 < num3) ? num1 : num3 : num2;
    }
}

或者,我们可以把它作为最后一个丑陋的步骤,最后只有一行:

int findMedian(int num1, int num2, int num3) {
    return (num1 < num2) ?(num2 < num3) ? num2 : (num1 < num3) ? num3 : num1 : (num2 < num3) ? (num1 < num3) ? num1 : num3 : num2;
}