#4
by 元学生A » 8年前
失礼、コードが間違っていたので訂正します。
コード:
#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が一般の場合)です。
コード:
#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;
}
この例ではソート手法にバブルソートを使っていますので、要素数nに対して、O(n^2)ほどの比較演算が必要です。要するに、遅いです。
この部分を早くしたければ、C言語であれば、qsort関数を使えばよいでしょう。(O(n log n)になります。ほぼO(n)といっても問題ないくらいに早いです)
失礼、コードが間違っていたので訂正します。
[code]
#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;
}
[/code]
[quote="元学生A" id=3,19379,146520]7個の数字を配列に入れて、昇順にソート(小さい順に並び替え)してから、4番目の数を出力すれば良いと思います。
一般のn個の数字では、nが基数なら[n / 2] + 1番目([]は小数以下切り捨て)、nが偶数なら[n / 2]番目と[n / 2] +1番目の平均を出力します。
以下、コード例(nが一般の場合)です。
[code]
#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;
}
[/code]
この例ではソート手法にバブルソートを使っていますので、要素数nに対して、O(n^2)ほどの比較演算が必要です。要するに、遅いです。
この部分を早くしたければ、C言語であれば、qsort関数を使えばよいでしょう。(O(n log n)になります。ほぼO(n)といっても問題ないくらいに早いです)[/quote]