查找众数及中位数(C++)

#include <iostream>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;

//寻找众数和中位数
struct nc{
    int num;
    int count;
};

bool compare(const nc& a, const nc& b){
    if(a.count != b.count){
        return a.count > b.count;
    }
    else{
        return a.num < b.num;
    }
}

int main() {
    map<int, int> num_count;//记录数字的次数
    int num;
    while(cin >> num){
        num_count[num]++;
    }
    vector<nc> max_count;//记录数字和数字出现的次数
    for(auto it : num_count){
        max_count.push_back({it.first, it.second});
    }
    //按照出现次数进行排列
    sort(max_count.begin(), max_count.end(), compare);
    int max_c = max_count[0].count;//最多出现次数
    vector<int> arr;//记录众数的数组
    int index = 0;
    while(max_count[index].count == max_c){
        arr.push_back(max_count[index].num);
        index++;
    }
    double mid;
    if(arr.size()%2 == 0){//arr.size()是偶数
        int r = arr.size()/2;
        mid = (double)(arr[r]+arr[r - 1])/2;
        printf("%.2f\n", mid);
    }
    else{
        mid = (arr[arr.size()/2]);
        cout << mid << endl;
    }
}

<think>好的,用户想知道如何在C++中计算中位数。我需要先回忆一下中位数的定义,然后结合提供的引用内容来组织答案。 首先,中位数是将数据集排序后位于中间位置的数。如果数据个数是奇数,就是中间的那个;如果是偶数,则是中间两个数的平均值。所以,计算中位数的基本步骤应该是先排序数组,然后根据长度判断奇偶,再取中间值。 根据引用[1]和[3],他们提到使用快速排序或归并排序对数组进行排序,然后计算中位数。这可能是一个常见的方法,特别是对于单个数组的情况。我需要确认这个步骤的正确性,并考虑如何实现。 接下来,用户可能需要示例代码。引用[1]和[3]中提到了C++的实现,所以应该参考这些内容。例如,引用[3]中的主函数创建了一个整数向量,调用findMedian函数,这可以作为示例代码的结构。 然后,我需要确保代码的步骤正确。包括排序数组,检查长度,然后计算中位数。例如,如果数组长度是偶数,取中间两个的平均;否则取中间的数。 另外,用户可能关心如何处理空数组或者异常情况,但根据引用内容,示例可能假设数组非空,所以需要在代码中进行判断,比如数组为空时返回0或者抛出异常,但引用中的示例可能没有处理,所以可能需要提醒用户注意这一点。 还有,引用[2]和[4]、[5]提到了更复杂的情况,比如两个正序数组的中位数,或者查找众数后的中位数,但用户的问题是关于单个数组的中位数计算,所以可能不需要涉及这些,但可以作为扩展提到。 最后,确保代码使用C++标准库中的排序函数,比如std::sort,这样代码会更简洁高效。例如,在引用[1]中,他们可能使用了快速排序,但实际在C++中直接调用sort函数即可,因为std::sort通常实现为内省排序,结合了快速排序和堆排序。 总结步骤: 1. 对数组进行排序。 2. 判断数组长度的奇偶性。 3. 根据奇偶性计算中位数。 在代码实现中,需要注意数组为空的情况,或者元素数量为0时的处理,但根据引用中的示例,可能没有处理,所以代码中可以添加检查。 现在,将这些步骤转化为示例代码,并解释每个部分的作用。同时,根据用户提供的引用,引用[1]、[3]可以作为参考,说明使用排序的方法。 可能的问题: - 如何处理偶数个元素的情况? - 是否需要自己实现排序算法,还是使用标准库? 根据引用[1],他们提到使用常见的排序方法如快速排序或归并排序,但在实际代码中,使用std::sort更简单,所以示例代码应该使用标准库的sort函数。 综上,整理出示例代码,并添加注释说明。同时,在相关问题部分,可以扩展关于两个数组的中位数、时间复杂度优化,或者处理众数后的中位数等问题,参考提供的引用内容。</think>在C++中计算中位数的核心步骤是**先排序后取中间值**。以下是实现方法及示例代码: --- ### 实现步骤 1. **排序数组** 使用标准库函数`std::sort`对数组进行升序排序。 2. **判断数组长度奇偶性** - 若长度为奇数,中位数为中间元素; - 若长度为偶数,中位数为中间两元素的平均值。 3. **处理边界条件** 检查数组是否为空,避免访问非法内存[^3]。 --- ### 示例代码 ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; double findMedian(vector<int>& nums) { if (nums.empty()) { cerr << "错误:数组为空" << endl; return 0; // 或抛出异常 } sort(nums.begin(), nums.end()); int n = nums.size(); if (n % 2 == 1) { return nums[n / 2]; } else { return (nums[(n / 2) - 1] + nums[n / 2]) / 2.0; } } int main() { vector<int> nums = {3, 1, 4, 1, 5, 9, 2, 6}; double median = findMedian(nums); cout << "中位数为: " << median << endl; // 输出:3.5 return 0; } ``` --- ### 关键点说明 - **时间复杂度**:主要由排序决定,`std::sort`平均为$O(n \log n)$[^1]。 - **边界处理**:示例中检查了空数组,避免运行时错误[^3]。 - **精度问题**:偶数长度时需用`2.0`确保结果为浮点数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值