用 C 语言计算数据集的中位数

CBeginner
立即练习

简介

在本实验中,你将学习如何用 C 语言计算数据集的中位数。本实验涵盖以下步骤:读取并对一组数字进行排序、找到中间元素或两个中间元素的平均值,以及打印中位数。逐步说明将指导你完成使用 C 语言实现这些任务的过程,包括用于读取、排序和打印数组的函数。本实验提供了一种实用的方法来理解和应用 C 语言中的统计分析技术。

读取并对数组进行排序

在这一步中,你将学习如何读取一组数字并对其进行排序,为计算中位数做准备。我们将使用 C 语言来完成这项任务。

首先,让我们创建一个 C 文件来实现数组的读取和排序:

cd ~/project
nano median_calculator.c

现在,将以下代码添加到该文件中:

#include <stdio.h>

#define MAX_SIZE 100

// 函数:读取数组元素
void readArray(int arr[], int *n) {
    printf("输入元素数量 (最大 %d):", MAX_SIZE);
    scanf("%d", n);

    printf("输入 %d 个元素:\n", *n);
    for (int i = 0; i < *n; i++) {
        scanf("%d", &arr[i]);
    }
}

// 函数:使用冒泡排序对数组进行排序
void sortArray(int arr[], int n) {
    for (int i = 0; i < n - 1; i++) {
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换元素
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

// 函数:打印数组
void printArray(int arr[], int n) {
    printf("已排序数组:");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);
    printArray(arr, n);

    return 0;
}

编译并运行该程序:

gcc median_calculator.c -o median_calculator
./median_calculator

示例输出:

输入元素数量(最大 100):5
输入 5 个元素:
42
15
7
23
11
已排序数组:7 11 15 23 42

让我们来分析一下这段代码:

  1. readArray() 函数允许用户输入数组元素
  2. sortArray() 使用冒泡排序算法将元素按升序排列
  3. printArray() 显示已排序的数组
  4. main() 函数将这些函数组合在一起

冒泡排序算法的时间复杂度为 O(n²),虽然易于理解,但对于大型数据集来说效率不是最高的。

找到中间元素或两个中间元素的平均值

在这一步中,你将扩展之前的程序,通过在已排序数组中找到中间元素或两个中间元素的平均值来计算中位数。

打开现有文件并修改代码:

cd ~/project
nano median_calculator.c

用一个新函数更新代码以计算中位数:

#include <stdio.h>

#define MAX_SIZE 100

// 之前的函数(readArray、sortArray、printArray)保持不变

// 新函数:计算中位数
float calculateMedian(int arr[], int n) {
    // 如果元素数量为奇数,返回中间元素
    if (n % 2!= 0) {
        return arr[n / 2];
    }

    // 如果元素数量为偶数,返回两个中间元素的平均值
    int mid1 = arr[(n / 2) - 1];
    int mid2 = arr[n / 2];
    return (mid1 + mid2) / 2.0;
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);
    printArray(arr, n);

    // 计算并打印中位数
    float median = calculateMedian(arr, n);
    printf("中位数:%.2f\n", median);

    return 0;
}

编译并运行更新后的程序:

gcc median_calculator.c -o median_calculator
./median_calculator

奇数个元素的示例输出:

输入元素数量(最大 100):5
输入 5 个元素:
42
15
7
23
11
已排序数组:7 11 15 23 42
中位数:15.00

偶数个元素的示例输出:

输入元素数量(最大 100):6
输入 6 个元素:
42
15
7
23
11
8
已排序数组:7 8 11 15 23 42
中位数:13.00

关于中位数计算的要点:

  1. 对于奇数个元素,中位数是中间元素
  2. 对于偶数个元素,中位数是两个中间元素的平均值
  3. 在计算中位数之前,数组必须已排序

calculateMedian() 函数处理两种情况:

  • 使用整数除法找到中间索引
  • 检查元素数量是奇数还是偶数
  • 返回适当的中位数

打印中位数

在这最后一步中,你将增强中位数计算程序,以提供更详细的输出,并展示呈现中位数的不同方式。

打开现有文件进行最终修改:

cd ~/project
nano median_calculator.c

用改进的输出格式更新代码:

#include <stdio.h>
#include <stdlib.h>

#define MAX_SIZE 100

// 之前的函数(readArray、sortArray、printArray、calculateMedian)保持不变

void printDetailedMedianInfo(int arr[], int n, float median) {
    printf("\n--- 中位数计算详情 --- \n");
    printf("元素总数:%d\n", n);
    printf("数组元素:");
    for (int i = 0; i < n; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n\n中位数计算:\n");

    if (n % 2!= 0) {
        printf("奇数个元素\n");
        printf("中间索引:%d\n", n / 2);
        printf("中间元素:%d\n", arr[n / 2]);
    } else {
        printf("偶数个元素\n");
        printf("两个中间索引:%d 和 %d\n", (n / 2) - 1, n / 2);
        printf("中间元素:%d 和 %d\n", arr[(n / 2) - 1], arr[n / 2]);
    }

    printf("\n最终中位数:%.2f\n", median);
}

int main() {
    int arr[MAX_SIZE];
    int n;

    readArray(arr, &n);
    sortArray(arr, n);

    float median = calculateMedian(arr, n);

    // 打印已排序数组
    printArray(arr, n);

    // 打印详细的中位数信息
    printDetailedMedianInfo(arr, n, median);

    return 0;
}

编译并运行更新后的程序:

gcc median_calculator.c -o median_calculator
./median_calculator

奇数个元素的示例输出:

输入元素数量(最大 100):5
输入 5 个元素:
42
15
7
23
11
已排序数组:7 11 15 23 42

--- 中位数计算详情 ---
元素总数:5
数组元素:7 11 15 23 42

中位数计算:
奇数个元素
中间索引:2
中间元素:15

最终中位数:15.00

偶数个元素的示例输出:

输入元素数量(最大 100):6
输入 6 个元素:
42
15
7
23
11
8
已排序数组:7 8 11 15 23 42

--- 中位数计算详情 ---
元素总数:6
数组元素:7 8 11 15 23 42

中位数计算:
偶数个元素
两个中间索引:2 和 3
中间元素:11 和 15

最终中位数:13.00

此步骤中的主要改进:

  1. 添加了一个新函数 printDetailedMedianInfo()
  2. 提供有关中位数计算的全面信息
  3. 展示奇数和偶数个元素的不同情况
  4. 增强用户对中位数计算的理解

总结

在本实验中,你学习了如何读取一组数字,使用冒泡排序算法对它们进行排序,并为计算中位数准备数据。然后将已排序的数组打印到控制台,这表明第一步已成功完成。冒泡排序算法虽然易于理解,但其时间复杂度为 O(n²),对于大型数据集来说可能不是最有效的。后续步骤将专注于找到已排序数组的中位数。

下一步是根据数组的大小确定中间元素或两个中间元素的平均值。这一步将确保准确计算中位数并呈现给用户。