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

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

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

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

マージ

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

ソート

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

解決済

マージソートのプログラムで最終的なソート結果のみを表示させたい

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

マージ

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

ソート

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

1回答

0リアクション

0クリップ

409閲覧

投稿2021/12/28 09:58

前提・実現したいこと

数値データを読み込んでマージソートを行うプログラムを作成しているのですが、最終的なソート結果のみを表示させるようにしたいです。

発生している問題・エラーメッセージ

最終的なソート結果のみを表示させたいが、途中のソート結果も表示されてしまう。

該当のソースコード

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <sys/time.h> int debug = 1; double gettime(){ struct timeval tp; double ret; gettimeofday(&tp, NULL); ret = (double)(tp.tv_sec & 0x00ffffff) + (double)tp.tv_usec / 1000000; return ret; } int *gamm; int *merge( int *alpha, int n, int *beta, int m ){ int gamm_used = 0; int i, j; i = 0; j = 0; while ( i < n && j < m ){ if ( alpha[i] <= beta[j] ) gamm[ gamm_used++ ] = alpha[ i++]; else gamm [ gamm_used++ ] = beta[ j++ ]; } if ( i < n && j >= m ){ while( i < n ) gamm[ gamm_used++ ] = alpha[ i++ ]; } if ( i >= n && j < m ){ while ( j < m ) gamm[ gamm_used++ ] = beta[ j++ ]; } for(i = 0; i < n; i++){ alpha[i] = gamm[i]; } for(j = 0; j < m; j++){ beta[j] = gamm[n+j]; } for(i = 0; i < n+m; i++){ printf("%d\n", gamm[i]); } return alpha; } int * m_sort( int *a, int i, int j ){ int k; if ( i == j ) return &a[i]; k = (i+j-1) / 2; return merge ( m_sort( a, i, k ), k-i+1, m_sort( a, k+1, j ), j-(k+1)+1 ); } int main( int argc, char *argv[]){ char *datafile; FILE *fp; int n; int *data; int i; if ( argc <= 1 ){ fprintf( stderr, "##### ファイルを指定してください\n" ); return 1; } datafile = argv[1]; if( argc <= 2){ fprintf( stderr, "##### データ数を指定してください\n"); return 1; } n = atoi( argv[2] ); data = (int *)malloc( n * sizeof(int) ); gamm = (int *)malloc( n * sizeof(int) ); fp = fopen( datafile, "r" ); for (i = 0; i < n; i++){ fscanf( fp, "%d", &data[i] ); } fclose( fp ); m_sort( data, 0, n-1 ); free ( data ); free ( gamm ); return 0; }

試したこと

int *merge()の最後の部分、for(i = 0; i < n+m; i++){ ...の部分を試行錯誤しているのですが、最終的なソート結果のみの表示になりません。
読み込むファイルはmerge-data.datと言う名前で、ファイルの中身は以下の通りです。

22
17
6
21
47
9
3
33

まず $ gcc -Wall -o merge merge.c をコンパイルし、
$ ./merge merge-data.dat 8 をコンパイルします。

上のソースコードでの実行結果は以下の通りです。

3
33
9
47
3
9
33
47
6
21
17
22
6
17
21
22
3
6
9
17
21
22
33
47

この最終結果、
3
6
9
17
21
22
33
47
のみを表示させたいです。

補足情報(FW/ツールのバージョンなど)

Cygwin64

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

C

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

マージ

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

ソート

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