top1编程
← 返回题目
题解

【入门】求中位数

1 条题解

  • 0
    @ 2026-7-31 10:42:42

    解题思路

    中位数就是一组数排序后,最中间的那个数。

    分两种情况:

    1. 奇数个:排序后直接取最中间那个,比如 5 个数就取第 3 个
    2. 偶数个:取最中间两个的平均数,比如 6 个数就取第 3、4 个的平均

    步骤:

    1. 从小到大排序
    2. 看 n 是奇数还是偶数
    3. 奇数:答案就是 a[n/2]
    4. 偶数:答案是 (a[n/2-1] + a[n/2]) / 2.0

    举个例子:2 5 8 1 6,排序后 1 2 5 6 8。

    • 5 个数是奇数,取第 3 个 → 5

    再比如 8 9 1 2 3 0,排序后 0 1 2 3 8 9。

    • 6 个数是偶数,取第 3、4 个的平均 = (2+3)/2 = 2.5

    注意:偶数个时要除以 2.0(小数),不能除以 2(整数),否则小数部分会丢。

    参考代码

    #include <iostream>
    #include <cstdio>
    using namespace std;
    
    int main() {
        int n, a[100];
        cin >> n;
        for (int i = 0; i < n; i++) cin >> a[i];
    
        // 从小到大排序
        for (int i = 0; i < n - 1; i++) {
            for (int j = 0; j < n - 1 - i; j++) {
                if (a[j] > a[j + 1]) {
                    int t = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = t;
                }
            }
        }
    
        // 奇数个取中间,偶数个取中间两个的平均
        double ans;
        if (n % 2 == 1) {
            ans = a[n / 2];
        } else {
            ans = (a[n / 2 - 1] + a[n / 2]) / 2.0;
        }
        printf("%.1f\n", ans);
        return 0;
    }
    

    复杂度分析

    • 时间复杂度:O(N²),冒泡排序
    • 空间复杂度:O(N),一个数组存数
    • 1