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

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

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

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

ソート

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

Q&A

解決済

2回答

3275閲覧

C言語の挟み込み法を用いた昇順のソーティング

Kassy11

総合スコア26

C

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

ソート

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

0グッド

0クリップ

投稿2019/04/25 00:39

編集2019/04/26 10:54

C言語で、挟み込み法を用いた昇順ソーティングを実行する関数(sort_func)を実装しています。
しかし、ソーティングが正しく行われていないようです。
原因がわからないため、教えていただけると幸いです。

#include <stdio.h> #include <stdlib.h> #define MAXDATA 10 static int number[MAXDATA]; int input_file(char *input_name); void output_file(char *output_name,int n, int number[]); void sort_func(int number[],int n); int main(int argc,char *argv[]) {/*agrv[1]は入力ファイル名、[2]は出力ファイル名*/ int n; if(argc != 3){/*ファイルは2つのみ*/ printf("入力ファイルと出力ファイルのみを指定してください.\n"); return 1; } n = input_file(argv[1]); sort_func(number,n); output_file(argv[2],n,number); return 0; } int input_file(char *input_name){/*入力ファイル名を受け取り、ファイルをオープンして読み込み、配列に格納し、配列の個数を返す*/ int count = 0, temp; FILE *fp; if((fp = fopen(input_name,"r")) == NULL){ printf("入力ファイルをオープンできませんでした。\n"); } while(fscanf(fp,"%d",&temp)==1){ if(count >= MAXDATA){ printf("エラー:整数は1個以上10個以下\n"); return 1; } number[count++] = temp; } printf("入力ファイルの処理完了。\n"); fclose(fp); return count; } void output_file(char *output_name, int n, int number[]){/*出力ファイル名を受け取り、ファイルをオープンして、配列の内容をファイルに書き込む*/ FILE *fp; int i; if((fp = fopen(output_name,"w")) == NULL){ printf("出力ファイルをオープンできませんでした。\n"); }else{ printf("書き込みに成功しました。\n"); for(i=0;i<n;i++){ fprintf(fp,"%d ",number[i]); } } fclose(fp); } void sort_func(int number[],int n){/*挟み込み法で昇順ソートする関数*/ int k,x,m,y; for(k=0;k<n;k++){ if(number[k-1]>number[k]){/*1.昇順になっていない配列の要素(number[i])を特定して、xに代入*/ x = number[k]; for(m=0;m<k;m++){/*2.特定した要素が入り込むのにふさわしい場所(m)を特定して、yに代入*/ if(number[m]>x){ y = m; while(y==k-1){/*3.入り込ませるためにもともとの要素を一つずつずらしていく*/ number[y+1] = number[y]; y++; } number[y] = x;/*4.ふさわしい場所に要素を入れ込む*/ } } } } printf("要素を昇順にソートしました。\n"); }

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

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

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

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

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

jimbe

2019/04/25 01:21

> ソーティングが正しく行われていないようです。 具体的に, どのようなデータをソートしようとしてどうなったのかを追記して頂けますか. コードをコピペすれば動かせる状態ですと, 現状と修正が共有・確認出来ますのでなお良いかと思います。
guest

回答2

0

ベストアンサー

  • kのループは1から開始する(別回答で指摘済み)
  • mを見つけるループは,mを見つけたら抜ける
  • 要素をずらしていく処理の条件がおかしい

…と思う.
やりたいことはこんな感じだろうか?

void sort_func( int number[], int n ) { int k,m,x,y; for( k=1; k<n; ++k ) //k=1から開始 { x = number[k]; if( number[k-1] <= x )continue; for( m=0; m<k; ++m ) { if( number[m] >= x )break; //mを見つけたらループ抜ける } for( y=k; y>m; --y ) //要素をずらしていく { number[y] = number[y-1]; } number[m] = x; } }

投稿2019/04/25 03:21

fana

総合スコア11632

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

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

stdio

2019/04/25 06:26

間違っていたらごめんなさい。 そのソースだとxとmが同じ値の場合の可能性があります。 結果は同じなので構いませんが、同じ値だとわざわざ入れ替える意味はないと思うのですが...
fana

2019/04/25 07:06

すみません.どのような指摘なのか良くわかりません. xは要素の値であり,mは配列のindexなので,両者が同じ値だから何かが起こる,ということはないと思うのですが.
fana

2019/04/25 07:13

> if( number[m] >= x )break; //mを見つけたらループ抜ける ここの'='が余計だという御指摘であれば,確かにそうですね. (質問者のコードでは'='は付いていないので,無意味に追加してしまったのは回答としても良くないですね.)
stdio

2019/04/25 07:15

あ、そうそう。xとnumber[m]の間違いですね。すみません。
Kassy11

2019/04/26 11:00

お二方ともありがとうございました。無事解決しました。
guest

0

for(k=0;k<n;k++){ if(number[k-1]>number[k]){

少し気になったのですが、そもそもここでエラーが発生していると思われます。

投稿2019/04/25 00:50

stdio

総合スコア3307

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問