比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
Compare and display 4 numbers ascending using min(a,b) and max(a,b)
f = min(min(a,b),min(c,d));
l = max(max(a,b),max(c,d));
ma = ?
mb = ?
所以,第一个和最后一个是显而易见的,但我怎么知道中间有哪些数字?
找到四个数字中第二高的一种非常懒惰的方法是计算所有可能的三元组的最大值,然后计算这些结果的最小值
min(max(a,b,c),max(a,b,d),max(a,c,d),max(b,c,d))
对于第二低的,你会做相反的操作
max(min(a,b,c),min(a,b,d),min(a,c,d),min(b,c,d))
现在可以简单地将其写在min(a,b)
和max(a,b)
的组合中。
这之所以有效,是因为在四个可能的三元组中,三个三元组将包含最大值,而一个三元组不包含。后一个三元组的最大值因此将给出第二个最高值,而前三个将产生最高值。取这四个值中的最小值将得到四元组中第二高的值。假设c
是最高值,a
是第二高
max(a,b,c) = c
max(a,b,d) = a
max(a,c,d) = c
max(b,c,d) = c
min(c,a,c,c) = a
一个相同的推理适用于第二个最低数的
您可以将它们分成3组,对组执行min/max操作,然后对结果执行相反的操作。我已经在代码中显示了零件结果。
#include <iostream>
#include <algorithm>
int main() {
int a=2;
int b=1;
int c=4;
int d=3;
std::cout << std::min({a,b,c,d}) << "n";
std::cout << std::max({std::min({a,b,c}), std::min({a,b,d}), std::min({a,c,d}), std::min({b,c,d})}) << "n";
// min-> 1 1 2 1
// max-> 2
std::cout << std::min({std::max({a,b,c}), std::max({a,b,d}), std::max({a,c,d}), std::max({b,c,d})}) << "n";
// max-> 4 3 4 4
// min-> 3
std::cout << std::max({a,b,c,d}) << "n";
}
但是,使用min/max似乎效率低下,因为相同的元素被多次比较,而std::sort可能使用quicksort进行平均O(n-logn(次比较。因此,我会使用sort来按顺序获取值。示例:
#include <iostream>
#include <algorithm>
#include <array>
int main() {
int a=2;
int b=1;
int c=4;
int d=3;
std::array A{a,b,c,d};
std::sort(A.begin(), A.end());
for(auto v : A) {
std::cout << v << "n";
}
}
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么不;名字在地图上是按顺序排列的吗
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 找到具有最多子串栅栏的字符串排列
- 为什么我的递归函数按降序打印,然后按升序打印?
- 重新排列单线以形成闭合多边形?
- 将值插入到标准 c++ 数组的正确索引(升序)中
- 在数组中输入 n 个整数的列表,并以类似于钟摆来回移动的方式排列它们. 输入-1 3 2 5 4,输出5 3 1 2 4
- C++ - 将元素按升序插入数组的 SEG 错误
- 输入的 C++ 排列
- 如何用单词排列向量中的每个字符升序?
- 如何检查 2D 数组在 c++ 中是否按升序排列?
- 字符串的升序排列
- 在stl映射中,关键帧是如何按升序排列的
- 按升序排列的矢量元素
- 如何用C++编写一个程序,该程序从输入中接收10个数字并检查这些数字是否按升序排列
- 生成0,1,…中所有可能的组合n-1, n (k)每个组合应按升序排列
- 排列中的升序子序列
- 按升序排列数组