C言語でデータのソートを行う方法

このQ&Aのポイント
  • C言語でデータのソートを行う方法について説明します。具体的には、データをクラスごとにソートし、さらに平均点の高い順に並び替える方法を紹介します。
  • ソートのためにint型、double型、char型のデータを入れ替える関数を用意する必要があります。
  • データのソートと入れ替えの関数の使い方を具体的なコード例を交えて説明します。最終的には、クラスごとにソートされたデータと平均点の高い順に並び替えられたデータが表示されます。
回答を見る
  • ベストアンサー

ソート

typedef struct{ int num; char name[20]; char type_of_class[8]; double average } data; data seiseki[100]; int main() { data[0].num = 1; strcpy(data[0].name, "山田太郎"); strcpy(data[0].type_of_class, "A_class"); data[0].average = 66.2; data[1].num = 2; strcpy(data[1].name, "鈴木二郎"); strcpy(data[1].type_of_class, "B_class"); data[1].average = 43.1; data[2].num = 3; strcpy(data[2].name, "佐藤三郎"); strcpy(data[2].type_of_class, "A_class"); data[2].average = 39.1; data[3].num = 4; strcpy(data[3].name, "加藤四郎"); strcpy(data[3].type_of_class, "Bclass"); data[3].average = 93.6; data[4].num = 5; strcpy(data[4].name, "石田五郎"); strcpy(data[4].type_of_class, "B_class"); data[4].average = 57.9; data[5].num = 6; strcpy(data[5].name, "草田六郎"); strcpy(data[5].type_of_class, "A_class"); data[5].average = 6.2; //ソート処理 } このように各値が決まってる時 まず同じクラスのものをソートし その中でaverage(平均点)の高い順に並べるソートを行いたいと思います。 最終的には 1,山田一郎,A,66.2 3,佐藤三郎,A,39,1 6,草田六郎,A,6.2 4,加藤四郎,B,93,6 5,石田五郎,B,57.9 2,鈴木二郎,B,43.1 のような感じになってると思います。ソートは行ごとです。 入れ替えの関数はint型のとdouble型のとchar型の3タイプ用意しています。 void intswap(int *p, int *q) { int temp; temp = *p; *p = *q; *q = temp; } void double(double * p, double *q) { double temp; temp = *p; *p = *q; *q = temp; } void wordswap(char p[], charq[]) { char *temp = strdup(p); strcpy(p, q); strcpy(q, temp); free(temp); } 残りがわかりません。 教えて下さい。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

とりあえず、データを交換する関数は void swap (data *from, data *to); だけで良いです。 data temp = *from; *to = *from; *from = temp; で丸ごと交換可能。 あと、大小判定の関数を作るのが良いでしょう。 bool isLarge(data a, data b) // a > b なら true; { if (strcmp(a.type_of_class, b.type_of_class) == 0) {// 同じクラスなら return (a.average > b.average); // 平均で大小判定 } else if (strcmp(a.type_of_class, b.type_of_class) > 0) { return true; } else { return false; } } これで、ソートのアルゴリズムを調べて if (a[i] > a[j]) ... とかあるところを、 if (isLarge(seiseki[i], seiseki [j])) に swap(&a, &b) ... を、swap(&seiseki[i], &seiseki[j]); とかに書き換えれば、それらしいものが出来るはずですが。 ソートのアルゴリズムは、「大小判定」して、順番が違っていたら「入れ替え る」ですから。

その他の回答 (3)

  • yama5140
  • ベストアンサー率54% (136/250)
回答No.4

☆クラスと平均点を結合し、いっしょくたにソートしています。 #include <stdio.h> #define Bias(c) (('Z'-c)*1000.0) // A から Z クラス限定、ソートキーの下駄 #define NIN 6 typedef struct{  int num;  char name[20];  char type_of_class[8];  double average; }STUDENT; STUDENT sgWork[ NIN ] = { // 構造体の初期化  { 1, "山田太郎", "A_class", 66.2 },  { 2, "鈴木二郎", "B_class", 43.1 },  { 3, "佐藤三郎", "A_class", 39.1 },  { 4, "加藤四郎", "B_class", 93.6 },  { 5, "石田五郎", "B_class", 57.9 },  { 6, "草田六郎", "A_class", 6.2 } // 六ちゃん、ガンバ }; void Output( void ) {  int i;  for( i = 0; i < NIN; i++ ){   printf( "%d,", sgWork[ i ].num );   printf( "%s,", sgWork[ i ].name );   printf( "%c,", sgWork[ i ].type_of_class[ 0 ] ); // 先頭文字のみ   printf( "%5.1lf\n", sgWork[ i ].average );  }  printf( "\n" ); } void SwapStruct( STUDENT *sBig, STUDENT *sSml ) {  STUDENT sTemp;  sTemp = *sBig;  *sBig = *sSml;  *sSml = sTemp; } void main( void ) {  int i, j;  double dMax, dNext;  Output();  for( i = 0; i < ( NIN - 1 ); i++ ){   dMax = Bias( sgWork[ i ].type_of_class[ 0 ] ) + sgWork[ i ].average;   for( j = ( i + 1 ); j < NIN; j++ ){    dNext = Bias( sgWork[ j ].type_of_class[ 0 ] ) + sgWork[ j ].average;    if( dNext < dMax ) continue;    SwapStruct( &sgWork[ j ], &sgWork[ i ] );    dMax = dNext;   }  }  Output(); } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

入れ替える関数なんか作っても無意味で, 比較する関数を作ることが重要. 比較関数は #2 でもいいけど int cmp(const void *a, const void *b) { const data *pa = a, *pb = b; int diff = strcmp(pa->type_of_class, pb->type_of_class); if (diff) { return diff; } else if (pa->average > pb->average) { return 1; } else if (pa->average < pb->average) { return -1; } else { return 0; } } とすれば qsort がつかえてお手軽 (ただし効率は無視).

  • zaqwe
  • ベストアンサー率0% (0/1)
回答No.1

ミスでは? seiseki[0]とかにしないとダメだとおもうよ それか data seiskeiを seiseki data[100]にするか

minaraiH
質問者

補足

また盛大にみすってます。 data[○].□ → seiseki[○].□です。

関連するQ&A

  • ソート

    #include <ctype.h> #include <string.h> #include <stdio.h> #include <stdlib.h> void swap(char p[], char q[]); void get(char bufG[],char **p_str); typedef struct { int number; char *class_type; char* name; char *subject; int num_akaten; } my; my *data; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000]; char bufG[1111]; char *str; int m; int line2 = 0; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf, 1000, fp) != NULL){ line2++; } fclose(fp); printf("%d\n", line2); if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } data = (my *)malloc(sizeof(my) * line2); while(fgets(buf,1000,fp) != NULL){ str = buf; while(*str != '\0'){ get(bufG,&str); switch(field){ case 0: data[line].number = atoi(bufG); break; case 1: data[line].class_type = (char *)malloc(strlen(bufG) +1); strcpy(data[line].class_type, bufG); break; case 2: data[line].name = (char *)malloc(strlen(bufG) + 1); strcpy(data[line].name, bufG); break; case 3: data[line].subject =(char *)malloc(strlen(bufG) + 1); strcpy(data[line].subject, bufG); break; case 4: data[line].num_akaten = atoi(bufG); } str++; field++; } line++; field = 0; } fclose(fp); for(m = 0; m < line; m++){ printf("%d\n", data[m].number); printf("%s\n", data[m].class_type); printf("%s\n", data[m].name); printf("%s\n", data[m].subject); printf("%d\n", data[m].num_akaten); } return 0; } void get(char bufG[],char **p_str) { int i; char *str; str = *p_str; for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ bufG[i] = '\0'; } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; *p_str = str; return ; } 前問題の解答例を提示してくださった方のサンプルをコピペさせてもらって成績の項目を追加しています。本文ではget関数の型はchar*型で文字列を返していますが今回の件では余り関係ないのでこのままで。 ファイルの中身は 1,犬,ボルト,国語,2 2,猫,山田,数学,1 3,犬,鈴木,英語,2 4,犬,居合,国語,1 5,猫,伊藤,数学,2 6,猫,斎藤,数学,1 のような感じになってます。 クラスの名前は今までアルファベットできたがこちらにしました。 名前自体に意味はありません。クラス名を文字列にしただけです。 やりたいソートの条件は赤点の多い順が優先でクラスと好きな教科が 同じものをソートしたい。優先順位は赤点→クラスとが一致→教科が一致 なので 1,犬,ボルト,国語,2 3,犬,鈴木,数学,2 5,猫,伊藤,数学,2 2,猫,山田,数学,1 6,猫,斎藤,数学,1 4,犬,居合,国語,1 このようなファイルに並び替えされます。 今試してるのは↑のソースで各値を入れ終わった後に for(p = 0; p < line; p++){ for(q = p + 1; q < line; q++){ if(data[p].num_akaten < data[q].num_akaten){ swap(&p,&q);//swapはp行とq行の全項目を入れ替える関数   } } } こうするととりあえず赤点数の順にはなります これからさらに上記のような並びにしたいです。(クラスと教科が同じ順) ここからどうすればいいでしょうか? 出来れば同じループ内で処理したいです。 私が考えていたのがp行のクラスとq行のクラスが同じ場合 p+1行目のクラスがp行目のクラスと異なっているなら p+1行目とq行目を交換するというのを試していましたが うまくいかないのでこの方法はダメなのでしょう。 他にもっとよい方法がある といった場合教えていただけると助かります。

  • 文字入れ替え

    #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> typedef struct { char number[6]; char class_type[20]; char name[8]; char subject[5]; } my; my data[100]; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char bufG[1111]; int i; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; switch(field){ case 0: strcpy(data[line].number, bufG); break; case 1: strcpy(data[line].class_type, bufG); break; case 2: strcpy(data[line].name, bufG); break; case 3: strcpy(data[line].subject, bufG); break; } field++; } else{ str++; } } line++; field = 0; } int p, q; for(p = 0; p < line; p++){ for(q = 0; q < line; q++){ if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ printf("p=%d q=%d\n", p, q); } } } fclose(fp); return 0; } こちらのプログラムは 1,A,山根,音楽//番号、クラス、名前、好きな教科 2,B,本田,美術 3,B,松本,美術 4,A,横野,音楽 というファイルの内容を読み込んでクラスと好きな教科が同じものを 1,A,山根、音楽 4,A,横野、音楽 2,B,本田、美術 3,B,松本、美術のようにソートするプログラムの続きですが ソート方法についてです。 if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ swap(data[p+1].number, data[q].number; swap(data[p+1].class_type, data[q].class.type); swap(data[p+1].name,data[q].name); swap(data[p+1].subject,data[q].subject); } void swap(char *p, char *q) { char *temp; temp = p; p = q; q= temp; } のように追加してみましたが入れ替えができていません。 どこがまずいのでしょうか?又他にも良い方法があれば教えて下さい。

  • 配列

    #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> typedef struct { char number[6]; char class_type[20]; char name[8]; char subject[5]; } my; my data[100]; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char bufG[1111]; int i; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; switch(field){ case 0: strcpy(data[line].number, bufG); break; case 1: strcpy(data[line].class_type, bufG); break; case 2: strcpy(data[line].name, bufG); break; case 3: strcpy(data[line].subject, bufG); break; } field++; } else{ str++; } } line++; field = 0; } int p, q; for(p = 0; p < line; p++){ for(q = 0; q < line; q++){ if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ printf("p=%d q=%d\n", p, q); } } } fclose(fp); return 0; } こちらのプログラムは 1,A,山根,音楽//番号、クラス、名前、好きな教科 2,B,本田,美術 3,B,松本,美術 4,A,横野,音楽 というファイルの内容を読み込んでクラスと好きな教科が同じものを 1,A,山根、音楽 4,A,横野、音楽 2,B,本田、美術 3,B,松本、美術のようにソートするプログラムの途中で 一致する行を表示しようとしている所です。 これをコンパイルした場合 一致しているのは 0行目と3行目 1行目と2行目 2行目と1行目 3行目と0行目と表示され実際には同じ行が含まれています。 このような場合どのように改善すればいいのか教えて下さい。

  • C++ ソートのやり方

    僕が作ったプログラムで、これはバブルソートなのかわからないので教えてください。 また、ほかのソートの仕方も教えてください。 よろしくお願いします。 汎用関数を使っているのでわかりにくいかもしれないですがお願いします。 #include <iostream> using namespace std; template <class X>void Sort(X *data, int size) { X temp; for (int i = 0; i < size; i++){ for (int j = i + 1; j < size; j++){ if (data[i]>data[j]){ temp = data[i]; data[i] = data[j]; data[j] = temp; } } } } int main() { int i[10]{1, 4, 3, 5, 2, 10, 2, 7, 6, 8}; char c[10]{'c', 'b', 'z', 'a', 'x', 'y', 'j', 'n', 'm', 'r'}; Sort(c, 10); Sort(i, 10); for (int j = 0; j < 10; j++){ cout << i[j] << ' '; } cout << endl; for (int j = 0; j < 10; j++){ cout << c[j] << ' '; } cout << endl; getchar(); return 0; }

  • メモリ

    #include "stdafx.h" #include <ctype.h> #include <string.h> #include <stdlib.h> int check(int a[100], int n); typedef struct { char number[6]; char class_type[20]; char name[8]; char subject[5]; } my; my data[100]; int main(int argc, char* argv[]) { FILE *fp; int field = 0, line = 0; char buf[1000], *str; char bufG[1111]; int i; if((fp=fopen("test3.csv","r"))==NULL){ printf("ファイルが開けません"); } while(fgets(buf,1000,fp) !=NULL){ str=buf; while(*str != '\0'){ if(*str != ','){ for(i = 0; *str != ',' && *str != '\0' ; i++){ if(*str == '\n'){ } else{ bufG[i] = *str; } str++; } bufG[i] = '\0'; switch(field){ case 0: strcpy(data[line].number, bufG); break; case 1: strcpy(data[line].class_type, bufG); break; case 2: strcpy(data[line].name, bufG); break; case 3: strcpy(data[line].subject, bufG); break; } field++; } else{ str++; } } line++; field = 0; } int p, q; int a[100]; int u = 0; for(p = 0; p < line; p++){ for(q = 0; q < line; q++){ if(strcmp(data[p].class_type, data[q].class_type) == 0 && strcmp(data[p].subject, data[q].subject) == 0 && p != q ){ //処理 } } } } fclose(fp); return 0; } 先日文字列入れ替えについてご質問したものですが メモリの取り方についてご質問します。 先日このプログラムにおいて my data[100]と固定してるのはいけないという意見をもらったので メモリを取得しようと思ってるのですが できればdata[i].○○の形でアクセスしたいのでこのままの形は あまりかえたくないです。この場合 while(fgets(buf,1000,fp) !=NULL){ str=buf;     int len = strlen(buf); my *o; o = (my *)calloc( len + 1, sizeof(my *)) while(*str != '\0'){ としてみたのですがこれは実際どうなのでしょうか? NULLは帰ってきてないみたいなので割り当ては出来てるとは思うんですが この一行の文字列の大きさにぴったり合うメモリを割り当てたいのですが ちゃんとなっているか調べる方法を教えて下さい。

  • リスト構造のソートで悩んでます。。。

    リスト構造のソートで悩んでます。プログラムの内容はファイルからデータをリスト構造の構造体に読み込み、名前順にソートし結果を表示する。というものです。データの追加や削除はできるのですがソートとなると頭が混乱してしまいお手上げ状態になってしまいました。。。。。 読み込み用のデータとプログラムソースを以下に記載するのでどなたか良きアドバイスをお願いしますm(_ _)m ○データ Sakuragi 16 Rukawa 16 Miyagi 17 Akagi 18 Mitsui 18 ○ソース #include <stdio.h> #include <stdlib.h> #include <string.h> #define MENBER 5 typedef struct data{ char name[BUFSIZ]; int age; struct data *next; }LIST; LIST *newLIST(void); LIST *sort(LIST *); int main(int argc,char *argv[]){ FILE *fp; LIST *p; LIST *np; LIST *npb; LIST *head; char namae[BUFSIZ]; int toshi,i; if((fp=fopen(argv[1],"r"))==NULL){ printf("no file\n"); exit(1); } head = newLIST(); npb =head; for(i=0;i<MENBER;i++){ np = newLIST(); fscanf(fp,"%s %d",namae,&toshi); strcpy(np->name,namae); np->age = toshi; npb->next =np; npb = np; } sort(head); for(p=head->next;p != NULL;p=p->next){ printf("%s\t%d\n",p->name,p->age); } for(p=head->next;p != NULL;p=np){ np = p->next; free(p); } fclose(fp); return(0); } LIST *newLIST(){ LIST *p; p = (LIST *)malloc(sizeof(LIST)); p->next = NULL; return(p); } LIST *sort(LIST *head){ }

  • ソートプログラム

    ファイルから10個の整数が 29 45 11 2 86 91 33 62 77 59 のように一行に1個の形式で格納されている。このファイルから10個の整数を読み込み、選択法でソートし、この数字を小さい順に表示するプログラムを作成したのですが、ソート部分がうまくできません。どなたかどうすれば改善できるか教えてください。 <プログラム> #include<stdio.h> #include<stdlib.h> #define MAXN 100 int A[MAXN]; main() { _inputdata(); _selectionsort(1,10); _printdata(); } selectionsort(p,q) ___int p, q; { _int i, j, cmin, temp; _for(j = p; j <= q; j++){ __cmin = j; /* A[cmin]が現在の最小値 */ __for(i = j+1; i <= q; i++) ___if(A[cmin] > A[i]) cmin = i; __/* A[j]とA[cmin]との入れ換え操作 */ __swap(j, cmin); _} } swap(int x, int y) { _int temp; _temp = x; _x = y; _y = temp; } inputdata() { _FILE *fp; _if((fp=fopen("integers10.dat", "r"))==NULL) { __printf("ファイルが見つかりません: integers10.dat\n"); __exit(EXIT_FAILURE); _} _printf("データを入力\n"); _while(fscanf(fp, "%s", A)!=EOF) { ____printf("%s\n",A); _} _fclose(fp); } <コンパイル→実行> % gcc -o sort1 sort1.c % ./sort1 データを入力 29 45 11 2 86 91 33 62 77 59 ソート済みデータ 0 0 0 0 0 0 0 0 0 0 %

  • C言語 ファイル処理に関する事

    テキストエディタで打ち込んだファイル 【hw.dat】 Akiba 160 59.3 Kurata 162 51.6 Masaki 182 76.5 Tanaka 170 60.7 Tsuji 175 83.9 Washio 175 72.5 名前・身長・体重のデータです。 <問>   「hw.dat」から読み込んだデータを身長順にソートした上で   表示するプログラムを作成せよ。 下記のプログラムでは実行結果が何も出てきません。 入門レベルのスキルしかありません。何処が良くないのでしょうか。 教えて下さい。 [プログラム]   #include <stdio.h>   #include <string.h>   void swap_double(double *x, double *y)   {   int temp = *x;   *x = *y;   *y = temp;   }   void swap_name(char *sx, char *sy)   {   char *temp;    strcpy(temp, sx);   strcpy(sx, sy);   strcpy(sy, temp);   }   void sort(double *he, double *we, int n)   {   int i, j;    for(i = 0; i < n - 1; i++){   if(*(he - 1) > *he ){ swap_double((he - 1), he); swap_double((we - 1), we); } } }   void sort_name(double *he, char *na, int n)   {    int i, j;    for(i = 0; i < n - 1; i++){   if(*(he - 1) > *he ){ swap_name((na - 1), na); } } }  int main(void)   {    FILE *fp;    int ninzu = 0;    char *name[100];    double height, weight;    double hsum = 0.0;    double wsum = 0.0;    int i;    char *na[i];    double he[6];    double we[6];    if ((fp = fopen("hw.dat", "r")) == NULL)    printf("\aファイルをオープンできません。\n");    else{   for(i = 0; i < 6; i++){   while (fscanf(fp, "%s%lf%lf", name , &height , &weight) != EOF ){ *na = *name; he[i] = height; we[i] = weight; ninzu++; hsum += he[i]; wsum += we[i];   printf("%-10s %5.1f %5.1f\n", na, height, weight);   }   }   printf("------------------------\n");   printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);   }   puts("\n身長順にソートしました。");   for(i = 0; i < 6; i++){ *na = *name; he[i] = height; we[i] = weight; ninzu++; hsum += he[i]; wsum += we[i]; }   for(i = 0; i < 6; i++){   sort(he, we, 6);   sort_name(he, *na, 6);   printf("%-10s %5.1f %5.1f\n", *(na + i) , *(he + i), *(we + i));   }   printf("------------------------\n");   printf("平均 %5.1f %5.1f\n", hsum / ninzu, wsum / ninzu);  fclose(fp);   return 0;  }   

  • 構造体を使ったプログラム

    学校でC言語を勉強しています。(まだ初心者です) テストの成績を入力して、その結果を降順にソートしたいんですけど、 下記のプログラムでは、正常に動かないです。 struct seiseki { char nama; int sansuu; int rika; int goukei; }; ~~~~~~~~~~~~~~~~~~~~ struct seiseki class_a; struct seiseki class_b; struct seiseki *ptr1; struct seiseki *ptr2; ptr1 = class_a; ptr2 = class_b; ~~~~成績はあらかじめ入力済み~~~~ sout(class_a, 3); sout(class_b, 3); void sout(struct seiseki *p, int num) { struct seiseki temp; int count; int j; for (count = 1; num > count; count++) { temp = p[count]; for (j = count; j > 0 && p[j - 1].goukei < temp.goukei; j--) { p[j] = p[j - 1]; } p[j] = temp; p++; } } class_aだけを実行するプログラムだとちゃんと表示されますが、 一度でclass_aとclass_bを実行するプログラムだと表示がおかしくなります。 どなたか教えてください。

  • C言語 ソートについて

    #include <stdio.h> #include <stdbool.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; // 交換回数 int count_comparison = 0; // 比較回数 void selection_sort(int a[], int n) { } int main(void) { int data[NUM_ARRAY][NUM_DATA] = {{9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表示 selection_sort(d, NUM_DATA); // 挿入ソートの実行 print_array(d, NUM_DATA); // ソート後の配列の表示 printf("比較回数: %d\n", count_comparison); // 比較回数の表示 printf("交換回数: %d\n", count_swap); // 交換回数の表示 } } 上の雛形を使って選択ソートを実行するという問題なのですが途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 下に自分が今書いているものを置いておきます。 #include <stdbool.h> #include <stdio.h> #define NUM_ARRAY 4 #define NUM_DATA 5 int count_swap = 0; int count_comparison = 0; void swap(int d[], int i, int j) { count_swap += 1; printf("swap a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); int temp = d[i]; d[i] = d[j]; d[j] = temp; } void copy_array(int *a, int *b, int n) { for (int i = 0; i < n; i++) { b[i] = a[i]; } } void print_array(int d[], int n) { for (int i = 0; i < n; i++) { printf("%d ", d[i]); } printf("\n"); } bool compare(int d[], int i, int j) { count_comparison += 1; printf("compare a[%d] = %d, a[%d] = %d\n", i, d[i], j, d[j]); if (d[i] > d[j]) { return true; } else { return false; } } void selection_sort(int d[], int n) { int min; for (int i = 0; i < n - 1; i++) { min = i; for (int j = i + 1; j < i; j++) { if (compare(d, min, j)) { min = j; } } swap(d, i, min); print_array(d, n); } } int main(void) { int data[NUM_ARRAY][NUM_DATA] = { {9, 7, 5, 6, 8}, {9, 8, 7, 6, 5}, {5, 6, 7, 8, 9}, {5, 6, 8, 7, 9}}; for (int i = 0; i < NUM_ARRAY; i++) { count_swap = 0; count_comparison = 0; int d[NUM_DATA]; copy_array(data[i], d, NUM_DATA); // 配列のコピー printf("----------------\n"); print_array(d, NUM_DATA); // ソート前の配列の表⽰ selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ print_array(d, NUM_DATA); // ソート後の配列の表⽰ printf("⽐較回数: %d\n", count_comparison); // ⽐較回数の表⽰ printf("交換回数: %d\n", count_swap); // 交換回数の表⽰ } }