中央値の求め方

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
茶茶

中央値の求め方

#1

投稿記事 by 茶茶 » 8年前

7個の数字の要素から中央値を求めるにはどうしたらよいですか。c言語です。

Math

Re: 中央値の求め方

#2

投稿記事 by Math » 8年前

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 スキップ ==========

コード:

中央値=78.000000
続行するには何かキーを押してください . . .
”中央値を求め”てないような気がするが...(^^;

元学生A

Re: 中央値の求め方

#3

投稿記事 by 元学生A » 8年前

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)といっても問題ないくらいに早いです)

元学生A

Re: 中央値の求め方

#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)といっても問題ないくらいに早いです)

かずま

Re: 中央値の求め方

#5

投稿記事 by かずま » 8年前

元学生A さんが書きました:

コード:

  // まずソート(バブルソート)
  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;
      }
    }
  }
それは選択ソートです。

バブルソートは次の通り

コード:

    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;
            }
        }
    }
おまけ。挿入ソート

コード:

    for (int i = 1; i < n; i++) {
        int j, temp = array[i];
        for (j = i; j > 0 && array[j - 1] > temp; j--)
            array[j] = array[j - 1];
        array[j] = temp;
    }
 

返信

“C言語何でも質問掲示板” へ戻る