中央値の求め方
Re: 中央値の求め方
Windows10,VC++2017Community でテスト。
”中央値を求め”てないような気がするが...(^^;
#include <stdio.h>
int main(void) {
double 数字の要素集[] = { 12,34,56,78,90,112,134 };
printf("中央値=%f\n", 数字の要素集[3]);
return 0;
}
1>------ ビルド開始: プロジェクト: ConsoleApplication1, 構成: Debug Win32 ------
1>c1.c
1>ConsoleApplication1.vcxproj -> D:\z17a\07\10\ConsoleApplication1\Debug\ConsoleApplication1.exe
1>ConsoleApplication1.vcxproj -> D:\z17a\07\10\ConsoleApplication1\Debug\ConsoleApplication1.pdb (Partial PDB)
========== ビルド: 1 正常終了、0 失敗、0 更新不要、0 スキップ ==========
Re: 中央値の求め方
7個の数字を配列に入れて、昇順にソート(小さい順に並び替え)してから、4番目の数を出力すれば良いと思います。
一般のn個の数字では、nが基数なら[n / 2] + 1番目([]は小数以下切り捨て)、nが偶数なら[n / 2]番目と[n / 2] +1番目の平均を出力します。
以下、コード例(nが一般の場合)です。
この例ではソート手法にバブルソートを使っていますので、要素数nに対して、O(n^2)ほどの比較演算が必要です。要するに、遅いです。
この部分を早くしたければ、C言語であれば、qsort関数を使えばよいでしょう。(O(n log n)になります。ほぼO(n)といっても問題ないくらいに早いです)
一般のn個の数字では、nが基数なら[n / 2] + 1番目([]は小数以下切り捨て)、nが偶数なら[n / 2]番目と[n / 2] +1番目の平均を出力します。
以下、コード例(nが一般の場合)です。
#include <stdio.h>
// 中央値を計算
// arrayを書き換えるので注意
// nの値のチェック等も入っていません。
double calcMedian(int *array, int n) {
// まずソート(バブルソート)
for(int i = 0; i < n; i++) {
for(int j = i + 1; i < n; i++) {
if (array[i] > array[j]) {
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
// nの偶奇で計算方法が変わる
if (n % 2 == 0) {
return ((double)array[n / 2] + array[n / 2 + 1]) / 2;
} else {
return array[n / 2];
}
}
int main() {
int array[] = {1,10,3,-2,7,1,4};
printf("%d\n", calcMedian(array, sizeof(array) / sizeof(array[0])));
return 0;
}
この部分を早くしたければ、C言語であれば、qsort関数を使えばよいでしょう。(O(n log n)になります。ほぼO(n)といっても問題ないくらいに早いです)
Re: 中央値の求め方
失礼、コードが間違っていたので訂正します。
#include <stdio.h>
// 中央値を計算
// arrayを書き換えるので注意
// nの値のチェック等も入っていません。
double calcMedian(int *array, int n) {
// まずソート(バブルソート)
for(int i = 0; i < n; i++) {
for(int j = i + 1; j < n; j++) {
if (array[i] > array[j]) {
int temp = array[j];
array[j] = array[i];
array[i] = temp;
}
}
}
// nの偶奇で計算方法が変わる
if (n % 2 == 0) {
return ((double)array[n / 2] + array[n / 2 + 1]) / 2;
} else {
return array[n / 2];
}
}
int main() {
int array[] = {1,10,3,-2,7,1,4}; // -2 1 1 3 4 7 10
printf("%f\n", calcMedian(array, sizeof(array) / sizeof(array[0])));
return 0;
}
元学生A さんが書きました:7個の数字を配列に入れて、昇順にソート(小さい順に並び替え)してから、4番目の数を出力すれば良いと思います。
一般のn個の数字では、nが基数なら[n / 2] + 1番目([]は小数以下切り捨て)、nが偶数なら[n / 2]番目と[n / 2] +1番目の平均を出力します。
以下、コード例(nが一般の場合)です。この例ではソート手法にバブルソートを使っていますので、要素数nに対して、O(n^2)ほどの比較演算が必要です。要するに、遅いです。#include <stdio.h> // 中央値を計算 // arrayを書き換えるので注意 // nの値のチェック等も入っていません。 double calcMedian(int *array, int n) { // まずソート(バブルソート) for(int i = 0; i < n; i++) { for(int j = i + 1; i < n; i++) { if (array[i] > array[j]) { int temp = array[j]; array[j] = array[i]; array[i] = temp; } } } // nの偶奇で計算方法が変わる if (n % 2 == 0) { return ((double)array[n / 2] + array[n / 2 + 1]) / 2; } else { return array[n / 2]; } } int main() { int array[] = {1,10,3,-2,7,1,4}; printf("%d\n", calcMedian(array, sizeof(array) / sizeof(array[0]))); return 0; }
この部分を早くしたければ、C言語であれば、qsort関数を使えばよいでしょう。(O(n log n)になります。ほぼO(n)といっても問題ないくらいに早いです)
Re: 中央値の求め方
それは選択ソートです。
バブルソートは次の通り
for (int i = 0; i < n - 1; i++) {
for (int j = n - 1; j > i; j--) {
if (array[j - 1] > array[j]) {
int temp = array[j - 1];
array[j - 1] = array[j];
array[j] = temp;
}
}
}