Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 프로그래밍으로 숫자 목록의 중앙값(Median) 구하기

중앙값(Median)이란?

목록의 요소들이 크기순으로 정렬되어 있을 때, 전체 항목을 양쪽에 동일한 개수의 항목이 남도록 둘로 나누는 가운데 값을 중앙값(median)이라고 합니다.

항목의 개수가 홀수이면 중앙값은 하나뿐이지만, 짝수이면 가운데 값이 두 개가 됩니다. 따라서 항목 수가 짝수일 때의 중앙값은 두 가운데 값들의 평균으로 정의됩니다.

알고리즘

중앙값을 계산하기 위한 알고리즘은 다음과 같습니다.

  1. 1단계 – 항목의 개수를 세면서 배열에 항목들을 입력받습니다.
  2. 2단계 – 항목들을 크기순으로 정렬합니다.
  3. 3단계 – 중앙값을 계산합니다.

정렬 로직

중앙값을 구하기 전에 숫자를 정렬하는 데 사용되는 로직은 다음과 같습니다.

for (i = 1 ; i <= n-1 ; i++){
    for (j = 1 ; j <= n-i ; j++){
        if (a[j] <= a[j+1]){
            t = a[j];
            a[j] = a[j+1];
            a[j+1] = t;
        } else
        continue ;
    }
}

중앙값 계산 로직

정렬된 목록에서 중앙값을 찾는 로직은 다음과 같습니다. 항목 수가 짝수면 가운데 두 값의 평균을, 홀수면 정확히 가운데 값을 선택합니다.

if ( n % 2 == 0)
    median = (a[n/2] + a[n/2+1])/2.0 ;
else
    median = a[n/2 + 1];

예제 프로그램

다음은 주어진 숫자들의 중앙값을 계산하는 완전한 C 프로그램입니다.

#include<stdio.h>
#define N 10
main( ){
    int i,j,n;
    float median,a[N],t;
    printf("Enter the number of items\n");
    scanf("%d", &n);
    /* 배열 a에 항목 입력 받기 */
    printf("Input %d values \n",n);
    for (i = 1; i <= n ; i++)
    scanf("%f", &a[i]);
    /* 정렬 시작 */
    for (i = 1 ; i <= n-1 ; i++){ /* i번째 패스 시작 */
        for (j = 1 ; j <= n-i ; j++) {
            if (a[j] <= a[j+1]) { /* 값 교환 */
                t = a[j];
                a[j] = a[j+1];
                a[j+1] = t;
            }
            else
            continue ;
        }
    } /* 정렬 끝 */
    /* 중앙값 계산 */
    if ( n % 2 == 0)
        median = (a[n/2] + a[n/2+1])/2.0 ;
    else
    median = a[n/2 + 1];
    /* 결과 출력 */
    for (i = 1 ; i <= n ; i++)
    printf("%f ", a[i]);
    printf("\n\nMedian is %f\n", median);
}

실행 결과

위 프로그램을 실행하면 다음과 같은 출력이 생성됩니다.

Enter the number of items
5
Input 5 values
2.3
1.2
3.8
4.6
8.9
8.900000 4.600000 3.800000 2.300000 1.200000

Median is 3.800000

실행 결과에서 볼 수 있듯이, 입력된 5개의 값이 내림차순으로 정렬된 후 가운데 위치한 값인 3.8이 중앙값으로 출력됩니다. 참고로 이 프로그램은 배열 인덱스를 1부터 사용하며, 정렬 방향(오름차순/내림차순)은 중앙 위치의 값이 동일하므로 중앙값 계산 결과에는 영향을 주지 않습니다.