質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

2回答

10481閲覧

マージソートの比較回数について

jhkufrtyeriyok2

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2015/05/14 10:03

マージソートについての質問です。
n個の配列データを昇順に並べ替えるプログラムで
配列を比較して出力はできたのですが、その比較回数をどこで数えたらいいのかが分かりません。
下がソースなんですけど、eの位置だと5回しか数えられていないみたいです。
あとどこでどのように数えたらいいのか教えてください。

#include <stdio.h>
#include <stdlib.h>

void MergeSort(int x[ ], int left, int right,int n,int *p);
void main(void);

/* 配列 x[ ] の left から right の要素のマージソートを行う */
void MergeSort(int x[ ], int left, int right,int n,int *p)
{
int temp[n];
int mid, i, j, k, e=0;

if (left >= right) /* 配列の要素がひとつなら /
return; /
何もしないで戻る */

/* ここでは分割しているだけ /
mid = (left + right) / 2; /
中央の値より /
MergeSort(x, left, mid,n,p); /
左を再帰呼び出し /
MergeSort(x, mid + 1, right,n,p); /
右を再帰呼び出し */

/* x[left] から x[mid] を作業領域にコピー */
for (i = left; i <= mid; i++){
temp[i] = x[i];
}

/* x[mid + 1] から x[right] は逆順にコピー */
for (i = mid + 1, j = right; i <= right; i++, j--){
temp[i] = x[j];
}

i = left; /* i とj は作業領域のデーターを /
j = right; /
k は配列の要素を指している */

for (k = left; k <= right; k++){ /* 小さい方から配列に戻す /
if (temp[i] <= temp[j]){
/
ここでソートされる */
e++;
x[k] = temp[i++];
}
else
x[k] = temp[j--];
}

*p=e;
}

void main(void)
{

int *x;
int n,i,l;
scanf("%d",&n);
x=(int *)malloc( sizeof(int)*n);

for(i=0;i<n;i++){
scanf("%d",&x[i]);
}

MergeSort(x,0,n-1,n,&l);

/* ソート後のデータを表示 */
for (i = 0; i < n; i++){
printf("%d", x[i]);
if(i==n-1)
printf("\n");
else
printf(" ");
}

printf("%d\n",l);
free(x);
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

lang

1 *p=e;

ここで、最後の再帰マージ時の比較回数で上書きしているからでは?
加算してやらないといけないような…。

C言語の理解は浅いですが、ポインタだったら勝手に加算されたりとかするのでしょうか。
であれば私の検討違いです、すみません。

投稿2015/05/15 03:50

編集2015/05/15 03:53
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

比較回数をカウントしたいのであれば

lang

1 for (k = left; k <= right; k++){ /* 小さい方から配列に戻す */ 2 if (temp[i] <= temp[j]) { 3 /* ここでソートされる */ 4 x[k] = temp[i++]; 5 } else { 6 x[k] = temp[j--]; 7 } 8 e++; /* 比較回数のカウント */ 9 }

とすべきですよね。元の位置でカウントアップしても、これは比較した結果「入れ替えが発生した場合」のカウントしかされていないです。

投稿2015/05/14 15:02

KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jhkufrtyeriyok2

2015/05/15 03:18

配列を一つ一つの要素に分ける前も合わせての総合的な比較回数を調べたいんですけど、どうすればいいですか? これだとたぶん分けた後のしか数えてないみたいで・・・ ちなみに実際は13回比較しているんですけど、教えてもらった位置で数えると8回しか数えていません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問