Monday, May 28, 2007
C언어] double 배열 중앙값, 중간값, 메디안 구하기 함수; Median Function
C언어에서 숫자가 들어 있는 배열의 중앙값(Median)을 구하는 예제 소스입니다. 아래의 getMedian 함수에, 배열명과 배열 요소 개수를 넣어주면 중앙값을 반환합니다. 다만 이미 크기순으로 소팅된 배열이어야 합니다. 그렇지 않으면 틀린 값을 반환합니다.
소스 파일명: example.cpp
C에서 중앙값 계산 예제 소스
소스 파일명: example.cpp
#include <stdio.h>
#include <stdlib.h> // qsort()
int comparisonFunctionDouble(const void *a, const void *b);
double getMedian(double* array, size_t arraySize);
int main(void) {
double a1[] = { 1, 2, 3 };
qsort((void *)a1, sizeof(a1) / sizeof(a1[0]), sizeof(a1[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a1, sizeof(a1) / sizeof(a1[0])) );
// 출력 결과: 2.00
double a2[] = { 1, 2, 3, 4 };
qsort((void *)a2, sizeof(a2) / sizeof(a2[0]), sizeof(a2[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a2, sizeof(a2) / sizeof(a2[0])) );
// 출력 결과: 2.50
double a3[] = { 4, 3, 1, 2 };
qsort((void *)a3, sizeof(a3) / sizeof(a3[0]), sizeof(a3[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a3, sizeof(a3) / sizeof(a3[0])) );
// 출력 결과: 2.50
double a4[] = { 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 };
qsort((void *)a4, sizeof(a4) / sizeof(a4[0]), sizeof(a4[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a4, sizeof(a4) / sizeof(a4[0])) );
// 출력 결과: 1320.00
double a5[] = { 1, 2 };
qsort((void *)a5, sizeof(a5) / sizeof(a5[0]), sizeof(a5[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a5, sizeof(a5) / sizeof(a5[0])) );
// 출력 결과: 1.50
double a6[] = { 100 };
qsort((void *)a6, sizeof(a6) / sizeof(a6[0]), sizeof(a6[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a6, sizeof(a6) / sizeof(a6[0])) );
// 출력 결과: 100.00
return 0;
}
// 중앙값 구하기 함수
// 주의! 크기 순으로 이미 정렬된 배열을 입력해야만 합니다.
// 코드의 효율성을 위해서 이 함수 자체에는
// 정렬 기능이 포함되어 있지 않습니다
double getMedian(double* array, size_t arraySize) {
size_t center = arraySize / 2; // 요소 개수의 절반값 구하기
if (arraySize % 2 == 1) { // 요소 개수가 홀수면
return array[center]; // 홀수 개수인 배열에서는 중간 요소를 그대로 반환
} else {
return (array[center - 1] + array[center]) / 2.0; // 짝수 개 요소는, 중간 두 수의 평균 반환
}
}
// qsort 내부에서 사용되는 비교 함수
int comparisonFunctionDouble(const void *a, const void *b) {
if (*(double*)a < *(double*)b) return -1;
if (*(double*)a == *(double*)b) return 0;
return 1;
}
#include <stdlib.h> // qsort()
int comparisonFunctionDouble(const void *a, const void *b);
double getMedian(double* array, size_t arraySize);
int main(void) {
double a1[] = { 1, 2, 3 };
qsort((void *)a1, sizeof(a1) / sizeof(a1[0]), sizeof(a1[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a1, sizeof(a1) / sizeof(a1[0])) );
// 출력 결과: 2.00
double a2[] = { 1, 2, 3, 4 };
qsort((void *)a2, sizeof(a2) / sizeof(a2[0]), sizeof(a2[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a2, sizeof(a2) / sizeof(a2[0])) );
// 출력 결과: 2.50
double a3[] = { 4, 3, 1, 2 };
qsort((void *)a3, sizeof(a3) / sizeof(a3[0]), sizeof(a3[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a3, sizeof(a3) / sizeof(a3[0])) );
// 출력 결과: 2.50
double a4[] = { 1345, 1301, 1368, 1322, 1310, 1370, 1318, 1350, 1303, 1299 };
qsort((void *)a4, sizeof(a4) / sizeof(a4[0]), sizeof(a4[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a4, sizeof(a4) / sizeof(a4[0])) );
// 출력 결과: 1320.00
double a5[] = { 1, 2 };
qsort((void *)a5, sizeof(a5) / sizeof(a5[0]), sizeof(a5[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a5, sizeof(a5) / sizeof(a5[0])) );
// 출력 결과: 1.50
double a6[] = { 100 };
qsort((void *)a6, sizeof(a6) / sizeof(a6[0]), sizeof(a6[0]), comparisonFunctionDouble);
printf( "%.2f\n", getMedian(a6, sizeof(a6) / sizeof(a6[0])) );
// 출력 결과: 100.00
return 0;
}
// 중앙값 구하기 함수
// 주의! 크기 순으로 이미 정렬된 배열을 입력해야만 합니다.
// 코드의 효율성을 위해서 이 함수 자체에는
// 정렬 기능이 포함되어 있지 않습니다
double getMedian(double* array, size_t arraySize) {
size_t center = arraySize / 2; // 요소 개수의 절반값 구하기
if (arraySize % 2 == 1) { // 요소 개수가 홀수면
return array[center]; // 홀수 개수인 배열에서는 중간 요소를 그대로 반환
} else {
return (array[center - 1] + array[center]) / 2.0; // 짝수 개 요소는, 중간 두 수의 평균 반환
}
}
// qsort 내부에서 사용되는 비교 함수
int comparisonFunctionDouble(const void *a, const void *b) {
if (*(double*)a < *(double*)b) return -1;
if (*(double*)a == *(double*)b) return 0;
return 1;
}
tag: cpp
C언어 | C/C++ (Visual C++)
<< Home