🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

マージ

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

アルゴリズム

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

ソート

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

Q&A

解決済

3回答

996閲覧

マージソートのコード

yuruyuru

総合スコア14

C

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

マージ

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

アルゴリズム

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

ソート

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

0グッド

0クリップ

投稿2021/03/16 00:52

##質問
アルゴリズムを勉強していてマージソートのコードを書いてみたのですが実行結果がうまくいかずどこが間違っているのかわからないため教えていただきたいです。

##コード

c言語

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

##実行結果
1 4 4 7 2 1 2

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

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

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

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

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

1T2R3M4

2021/03/16 01:01

どのようなデバッグをしたのか追記してくださいませんか。
yuruyuru

2021/03/16 01:14

すいませんデバッグというものを知らず投稿しました。 一度ソフトなどを使って試してみようと思います。
tain

2021/03/16 01:47

gdbなどのツールを使ったり、総合開発環境のデバッガを使うな方法がベストですが、この規模ならprintfで随時変数の値が意図通りか確認するのも立派なデバッグです。
guest

回答3

0

自己解決

printfを使って間違いを見つけ修正できました。
デバッグの環境を整えようと思います。
複数人から同じアドバイスをいただいたのでベストアンサーではなく自己解決とさせていただきました。
皆さんありがとうございました。

投稿2021/03/16 03:00

yuruyuru

総合スコア14

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

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

0

インデント(字下げ)を適切に行ってください。
修正は 2個所です。

C

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

投稿2021/03/16 02:47

kazuma-s

総合スコア8224

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

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

0

C言語のコードを書くなら、デバッグできる環境を整えましょう。
Eclipseや、WindowsならVisualStudioなど。
コードの任意の場所で実行を止め、変数のナカミを見ることができます。そこから1行づつ実行して、コードの流れを見れるようになります
そうすれば、アテズッポでコードを書かなくて済むようになります。

投稿2021/03/16 02:02

y_waiwai

総合スコア88038

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問