You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C/C++高效从4元素数组中选取2个最大元素并保留顺序?

高效从4元素数组选取前两大元素并保留原顺序的C/C++实现

核心思路

因为数组固定为4个元素,我们可以通过预定义的比较逻辑减少分支判断,利用max/min(假设对应硬件指令无分支)优化性能,同时保证最终结果保留原数组中的出现顺序。

实现方案

步骤拆解

  1. 找出数组中的最大值和次大值,同时记录它们在原数组中的位置;
  2. 根据位置先后顺序,决定两个值的输出排列(位置靠前的先输出,靠后的后输出)。

代码实现

#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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 20:36:07