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

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

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

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

マージ

複数のデータベースやファイル、プログラムなどを決まった手順や規則に従って一つに結合すること。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

Q&A

解決済

2回答

974閲覧

C言語 マージソートの書き換えを行いたい

Kchan_01

総合スコア110

C

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

マージ

複数のデータベースやファイル、プログラムなどを決まった手順や規則に従って一つに結合すること。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

ソート

複数のデータを、順序性に従って並べ替えること。 データ処理を行う際に頻繁に用いられ、多くのアルゴリズムが存在します。速度、容量、複雑さなどに違いがあり、高速性に特化したものにクイックソートがあります。

再帰

情報工学における再帰とは、プログラムのあるメソッドの処理上で自身のメソッドが再び呼び出されている処理の事をいいます。

0グッド

0クリップ

投稿2020/04/12 22:35

編集2020/04/12 22:37

C言語でアルゴリズムを学んでいる初学者です。
マージソートのアルゴリズムを自分なりに書き換えて理解しようとしているのですが、うまくいきません。
普段ならデバッグをしながら実装の違いを把握できるのですが、再帰が繰り返されるのでデバッグを使って理解するのが難しいです。

どこの部分でうまく書き換えられていないのか、理解出来ず、ご指摘いただけましたら幸いです。

##自分で書き換えたもの

c

1void merge_sort(int A[], int left, int right) 2{ 3 int i, j, k, mid; 4 int work[10]; 5 6 if (left < right) 7 { 8 mid = (left + right) / 2; 9 merge_sort(A, left, mid); 10 merge_sort(A, mid + 1, right); 11 12 for (i = left; i <= mid; i++) 13 work[i] = A[i]; 14 15 for (j = mid + 1; j <= right; j++) 16 work[j] = A[j]; 17 18 i = left; 19 j = mid + 1; 20 for (k = left; k <= right; k++) 21 { 22 if (work[i] < work[j]) 23 A[k] = work[i++]; 24 else 25 A[k] = work[j++]; 26 } 27 } 28}

##参考にしているもの

c

1#include <stdio.h> 2 3void print_array(int array[], int array_len) 4{ 5 for (int i = 0; i < array_len; i++) 6 { 7 printf("%d", array[i]); 8 if (i != array_len - 1) 9 printf(" "); 10 } 11 printf("\n"); 12} 13 14void merge_sort(int A[], int left, int right) 15{ 16 int i, j, k, mid; 17 int work[10]; 18 19 if (left < right) 20 { 21 mid = (left + right) / 2; 22 merge_sort(A, left, mid); 23 merge_sort(A, mid + 1, right); 24 25 for (i = left; i <= mid; i++) 26 work[i] = A[i]; 27 28 for (j = mid + 1; j <= right; j++) 29 work[right - (j - (mid + 1))] = A[j]; 30 31 i = left; 32 j = right; 33 for (k = left; k <= right; k++) 34 { 35 if (work[i] < work[j]) 36 A[k] = work[i++]; 37 else 38 A[k] = work[j--]; 39 } 40 } 41} 42 43int main(void) 44{ 45 int N = 10; 46 int A[10] = {2, 1, 8, 5, 4, 7, 9, 11, 6, 3}; 47 48 merge_sort(A, 0, N - 1); 49 print_array(A, N); 50 51 return 0; 52}

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

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

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

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

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

guest

回答2

0

コンパイラは何を使っていますか?

int work[10] = { }; となっていますが、
C では、空の初期化子は許されていません。

gcc なら拡張機能でエラーになりません。
また、VC++ なら、ファイルの拡張子を .cpp にして、
C++ としてコンパイルしているのではありませんか?

デバッグですが、
if (work[i] <= work[j]) の直前に
printf("i = %d, j = %d\n", i, j); を入れてみてください。

投稿2020/04/13 01:12

kazuma-s

総合スコア8224

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

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

0

自己解決

デバッグする際のarrayの出力箇所が理解できました。もう少し自分で考えてみます。

c

1void merge_sort(int A[], int left, int right) 2{ 3 int i, j, k, mid; 4 int work[10] = {}; 5 6 if (left < right) 7 { 8 mid = (left + right) / 2; 9 merge_sort(A, left, mid); 10 merge_sort(A, mid + 1, right); 11 12 for (i = left; i <= mid; i++){ 13 work[i] = A[i]; 14 } 15 16 for (j = mid + 1; j <= right; j++){ 17 work[j] = A[j]; 18 } 19 print_array(work, 10); // ここ 20 i = left; 21 j = mid + 1; 22 for (k = left; k <= right; k++) 23 { 24 if (work[i] <= work[j]) 25 A[k] = work[i++]; 26 else 27 A[k] = work[j++]; 28 } 29 print_array(A,10); //ここ 30 } 31}

投稿2020/04/12 22:46

Kchan_01

総合スコア110

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問