如何用C/C++高效从4元素数组中选取2个最大元素并保留顺序?
高效从4元素数组选取前两大元素并保留原顺序的C/C++实现
核心思路
因为数组固定为4个元素,我们可以通过预定义的比较逻辑减少分支判断,利用max/min(假设对应硬件指令无分支)优化性能,同时保证最终结果保留原数组中的出现顺序。
实现方案
步骤拆解
- 找出数组中的最大值和次大值,同时记录它们在原数组中的位置;
- 根据位置先后顺序,决定两个值的输出排列(位置靠前的先输出,靠后的后输出)。
代码实现
#include <algorithm> // 用于max/min #include <utility> // 用于pair存储值和索引 #include <cstdio> // 返回包含两个最大元素且保留原顺序的数组 int* getTopTwoOrdered(int arr[4]) { static int result[2]; // 存储每个元素的(值, 索引)对 std::pair<int, int> elem0 = {arr[0], 0}; std::pair<int, int> elem1 = {arr[1], 1}; std::pair<int, int> elem2 = {arr[2], 2}; std::pair<int, int> elem3 = {arr[3], 3}; // 分阶段筛选前两大元素,用max/min减少分支 std::pair<int, int> max1 = std::max(elem0, elem1); std::pair<int, int> max2 = std::max(elem2, elem3); std::pair<int, int> top1 = std::max(max1, max2); std::pair<int, int> top2_candidate1 = std::min(max1, max2); std::pair<int, int> top2_candidate2 = std::max(std::min(elem0, elem1), std::min(elem2, elem3)); std::pair<int, int> top2 = std::max(top2_candidate1, top2_candidate2); // 根据索引顺序排列结果 if (top1.second < top2.second) { result[0] = top1.first; result[1] = top2.first; } else { result[0] = top2.first; result[1] = top1.first; } return result; } // 测试示例 int main() { int arr1[] = {1,4,3,5}; int* res1 = getTopTwoOrdered(arr1); printf("%d %d\n", res1[0], res1[1]); // 输出4 5 int arr2[] = {1,5,3,4}; int* res2 = getTopTwoOrdered(arr2); printf("%d %d\n", res2[0], res2[1]); // 输出5 4 int arr3[] = {1,3,4,3}; int* res3 = getTopTwoOrdered(arr3); printf("%d %d\n", res3[0], res3[1]); // 输出4 3或3 4,符合题目要求 return 0; }
性能说明
- 整个过程仅使用1次条件判断(最后根据索引排序),其余操作均为
max/min调用,假设这些函数对应硬件无分支指令,能最大化减少分支预测开销; - 固定处理4个元素,时间复杂度为O(1),无循环,性能最优。
模糊情况处理
对于1,3,4,3这类存在多个次大值的场景,代码会选取值最大的两个元素,再根据它们的原索引顺序排列,两种符合要求的输出均可能出现,完全满足题目要求。
内容的提问来源于stack exchange,提问作者user2052436
相关产品推荐
相关产品推荐

