C言語で選択ソートを実行する方法と結果の表示方法

このQ&Aのポイント
  • C言語で選択ソートを実行する方法とその結果を表示する方法について解説します。
  • 選択ソートは配列を昇順に並び替えるアルゴリズムの一つで、要素を比較して最小値を選び、順番に並べ替えていく方法です。
  • 実際のプログラムでは、配列のコピー、要素の比較、要素の交換などが行われます。ソート後の配列や比較回数、交換回数も表示されます。
回答を見る
  • ベストアンサー

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); // 交換回数の表⽰ } }

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

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

明日真面目に見ますが、 for (int i = 0; i < n - 1; i++) { for (int j = i + 1; j < i; j++) { この2段ループは正しいと思います。 要するに[4,3,2,1]だった場合に 「1」が「4」の位置に行く必要がある時の 最大数は、変数の長さ-1なので。 4<>3 3<>2 2<>1 ここで入れ替えられるが、4回目ではなく3回目だからです。 で、j=i+1なのは 4<>3 「3」の位置は「4」の位置の次、つまりi+1だから ネストループはi+1で正しい。 ってのを、親ループで0~3-1(つまり0,1,2だということで) これはあってますよ。 違和感は、minに覚える必要がなくて、単にいきなり 入れ替えればそれでよかっただけ! それだけで実際治るとは思います。

MAPILONN
質問者

お礼

あれから色々と試してみた結果実行結果通りに実行できました! いつも丁寧に解説してくださって本当にありがとうございます!

その他の回答 (4)

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.5

どんな結果がほしいんですか?

回答No.3

>swap(d, i, min); ←この位置って、常にmin=iなんだから意味がないのでは? ここは私のミス。 サブのjループでオーバーライドされてますね。

回答No.2

まだ実際にトレースしたわけじゃないのですが、 ソース内をパッと見て、気持ち悪さを感じたところから 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って常にiなんじゃ? min = j; ←覚えるより、この時点でswapでいいんじゃ? } } swap(d, i, min); ←この位置って、常にmin=iなんだから意味がないのでは? print_array(d, n); } } などが、気持ち悪く感じた部分になりますね。 ある程度プログラムをやってると(と言っても私は水商売で暇なのでやり始めた程度ですが) 「?なんか、違和感があるぞ?」って感じる時があり、 それを、気持ち悪いぞ!って表現してるんですが。 この感覚が体に染みつくと、後は結構 ほとんどの言語で、金になりますよ^^ JAVA系なら月120万以上稼げる仕事も多く、 PHP系でも、80万とかもざらにあります。 ですが、言語が違っても、この「気持ち悪いぞ?」って 雰囲気だけで、結構いけるんですよね^^ もし、仕事として、勉強しているのであれば、 その感覚がいつか身に付いたらおいしいですよ! #define NUM_ARRAY 4 #define NUM_DATA 5 void selection_sort(int d[], int n) { これも、少し気持ち悪い系 selection_sort(d, NUM_DATA); // 挿⼊ソートの実⾏ 固定値でしか呼ばないなら、このパラメータそのものがいらないね! ってな。 ただし、後で分離する可能性があるって意思表示する為の ソースなんだな!と認識する人が多いとは思います。 (ここは、別に間違いではない!ただ気持ち悪いだけ) 目で(脳みそ)で経路を追いかけて行ったとき、 「?」にぶつかるその時が一番楽しい時間ですよ! プログラムって。 明日、真面目に見てみますよ。まだ解決していなかったら。

MAPILONN
質問者

補足

色々ありがとうございます! 取り敢えず今回教えてもらったことを踏まえて自分でも取り組んでみます!

回答No.1

しばらく回答がついていないようなので、 要件定義をお願いできます? >途中までそれっぽいのは出来たのですが上手くいかないので解答をお願いします。 それと、どうなったら正しい(検収)になるのかと。 多分簡単な事だとは思うのですが、 問題と答えがわからないので、質問者が何を 間違っているのかが判断できないもので。

MAPILONN
質問者

補足

---------------- 97568 compare a[0] = 9, a[1] = 7 swapa[1]=7, a[0]=9 79568 compare a[1] = 9, a[2] = 5 swapa[2]=5, a[1]=9 compare a[0] = 7, a[1] = 5 swapa[1]=5, a[0]=7 57968 compare a[2] = 9, a[3] = 6 swapa[3]=6, a[2]=9 compare a[1] = 7, a[2] = 6 swapa[2]=6, a[1]=7 compare a[0] = 5, a[1] = 6 56798 compare a[3] = 9, a[4] = 8 swapa[4]=8, a[3]=9 compare a[2] = 7, a[3] = 8 56789 56789 比較回数: 8 交換回数: 6 ---------------- 98765 compare a[0] = 9, a[1] = 8 swapa[1]=8, a[0]=9 89765 compare a[1] = 9, a[2] = 7 swapa[2]=7, a[1]=9 compare a[0] = 8, a[1] = 7 swapa[1]=7, a[0]=8 78965 compare a[2] = 9, a[3] = 6 swapa[3]=6, a[2]=9 compare a[1] = 8, a[2] = 6 swapa[2]=6, a[1]=8 compare a[0] = 7, a[1] = 6 swapa[1]=6, a[0]=7 67895 compare a[3] = 9, a[4] = 5 swapa[4]=5, a[3]=9 compare a[2] = 8, a[3] = 5 swapa[3]=5, a[2]=8 compare a[1] = 7, a[2] = 5 swapa[2]=5, a[1]=7 compare a[0] = 6, a[1] = 5 swapa[1]=5, a[0]=6 56789 56789 比較回数: 10 交換回数: 10 ---------------- 56789 compare a[0] = 5, a[1] = 6 56789 compare a[1] = 6, a[2] = 7 56789 compare a[2] = 7, a[3] = 8 56789 compare a[3] = 8, a[4] = 9 56789 56789 比較回数: 4 交換回数: 0 ---------------- 56879 compare a[0] = 5, a[1] = 6 56879 compare a[1] = 6, a[2] = 8 56879 compare a[2] = 8, a[3] = 7 swapa[3]=7, a[2]=8 compare a[1] = 6, a[2] = 7 56789 compare a[3] = 8, a[4] = 9 56789 56789 比較回数: 5 交換回数: 1 上のような実行結果になれば良いのですがcompareが表示されなくて色々試してるのですがわかりません…

関連するQ&A

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力させることはできたんですが、単位がわかりません。教えてください。 以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; } 実行結果: (ソートは省略) count of comparisons : 499500 count of swap : 14848 2.950000 と出力されたのですが読み方?単位が分かりません。教えてください。2分ぐらいかかった気がします。

  • C言語について質問です。

    ソートについて勉強していて、乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力するのはどうやってやるのですか?教えてください。以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。これに処理時間を出力するようにしてもらいたいのですが、どうしたらいいですか?解説とソースファイルをよろしくお願いします。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); return 0; }

  • C言語について質問です。

    前に質問した訂正です。前の質問に関しては質問の意図が伝わりにくい文章で本当に申し訳ないと思っています。 乱数列の要素数Nの値を変えていきバブルソートの交換回数、比較回数を数えるプログラムを作り、後は処理時間について調べたいのですが、処理時間を出力させることはできたんですが、単位がわかりません。教えてください。 以下に乱数を生成するrand.cとバブルソートを行うbubblesort.cを記載します。 rand.c #include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000 int num[N]; int makeDataFile ( void ) { int i; FILE *fp; char s[100]; int num[N]; srand ( ( unsigned )time ( NULL ) ); fp = fopen ("rand1.txt", "w" ); if ( fp == NULL ) exit(1); for ( i = 0; i < N; i++ ){ fprintf ( fp, "%d\n", rand()%100 ); } fclose ( fp ); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) exit(1); while( fgets ( s, sizeof (s), fp ) ) { printf ( s ); } fclose ( fp ); return N; } bubblesort.c #include <stdio.h> #include <time.h> extern int makeDataFile ( void ); extern int num[]; void BubbleSort ( int x[] , int n ); void Show ( int x[] , int n ); int comp; int swap; void BubbleSort ( int x[] , int n ) { int i, j, tmp; for ( i = 0; i < n-1; i++ ) { for ( j = n-1; j > i; j-- ){ comp++; if ( x[i] > x[j] ){ swap++; tmp = x[j]; x[j] = x[i]; x[i]= tmp; Show ( x , n ); } } } } void Show ( int x[] , int n ) { while ( n-- ) printf ( "%d " , *x++ ); printf ( "\n" ); } int main(void) { int i, j, n , tmp; FILE *fp; comp = 0; swap = 0; n = makeDataFile(); clock_t start , finish; double duration; start = clock(); fp = fopen ( "rand1.txt", "r" ); if ( fp == NULL ) return 1; for ( i = 0; i < n; i++ ){ fscanf ( fp, "%d", &(num[i] ) ); } fclose ( fp ); printf ( "\nbefore bubblesort\n" ); Show ( num , n ); printf ( "\n" ); printf ( "progress bubblesort\n" ); BubbleSort ( num , n ); printf ( "\n" ); printf ( "after bubblesort\n" ); Show ( num , n ); printf ( "\n" ); finish = clock(); duration = (double)(finish-start) / CLOCKS_PER_SEC; printf ( "count of comparisons : %d\n" , comp ); printf ( "count of swap : %d\n" , swap ); printf ( "%lf\n" , duration ); return 0; } 実行結果: >gcc rand.c bubblesort.c (ソートは省略) count of comparisons : 499500 count of swap : 14848 2.950000 と出力されたのですが読み方?単位が分かりません。教えてください。自分の答えとしては2分55秒だと思うんですが合ってますか?連続質問ですいません。

  • c言語 select sort

    最大値検索法のプログラムコードです。 どこがおかしいのでしょうか? 分かる方、教えてください。 よろしくおねがいします。 swapのプログラムコード #include <stdio.h> void swap(int *px,int *py); int main (void) { FILE *fp; if ((fp=fopen("file.txt","rt"))==NULL){ printf("File open error.\n"); return 0; } int i,a[100]; for(i=0;i<100;i++){ fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。// } fclose(fp); for(i=0;i<10;i++) printf("[%d]=%d\n",i,a[i]); /*1.ソートすべきデータの中で最大のデータを見つけ、 2.そのデータを最後のデータと入れ替える。 最大データは配列のどこにあるのか⇒maxi              その値⇒max とする。*/ //データが10個の場合 int max,maxi,j; max=a[0],maxi=0; for(i = 0;i < 9; i++){ if(a[i + 1] > max){ max = a[i + 1]; maxi = i + 1; } swap(&a[maxi],&a[9-j]); /* コマンド $cc sort.c swap.c */ for(j=0;j<9;j++){ printf("%d\n",j); max=a[0], maxi=0; for(i=0;i<9-j;i++){ //最大値をもつデータ探索;(カウンタ変数) max++; } //最大データと探索範囲最後のデータとの入れ替え: //void swap(int *px, int *py){ int n,*px,*py; n = *px; *px = *py; *py = n; // } if((fp=fopen("file.txt","wt"))==NULL){ printf("File open error.\n"); return 0; } for(i=0;i<100;i++){ fprintf(fp,"%d",a[i]); } fclose(fp); } } sort.cのプログラムコード #include<stdio.h> void swap (int *px,int *py); int main(void) { int a[0],b,maxi,j,max; max=a[0],maxi=0; printf("input \"a\" as integer = "); scanf("%d",&a); printf("input \"b\" as integer = "); scanf("%d",&b); printf("Before swap...\n"); printf("a - b = %d, a / b = %d...%d\n",a-b,a-b,a-b); // swap(&px,&py); swap(&a[maxi],&a[9-j]); printf("After swap...\n"); printf("a - b = %d, a / b = %d...%d\n",a-b,a-b,a-b); return 0; } void swap (int *px,int *py) { int n; n = *px; *px = *py; *py = n; } 実行結果 /tmp/ccBGIpCi.o(.text+0x0): In function `main': : multiple definition of `main' /tmp/ccMCttJd.o(.text+0x0): first defined here /usr/bin/ld: Warning: size of symbol `main' changed from 304 in /tmp/ccMCttJd.o to 641 in /tmp/ccBGIpCi.o collect2: ld はステータス 1 で終了

  • C言語 セグメンテーション違反

    最大値検索法のプログラムソースを書きましたが、 実行すると、セグメンテーション違反となってしまいます。 どこがおかしいのでしょうか? 分かる方、教えてください。 宜しくお願いします。 swapのソース #include <stdio.h> void swap(int *px,int *py); int main (void) { FILE *fp; if ((fp=fopen("file.txt","rt"))==NULL){ printf("File open error.\n"); //ファイルが無い場合のエラー処理// return 0; } int i,a[10]; for(i=0;i<100;i++){ fscanf(fp,"%d,",&a[i]); //ファイルから読み込み処理。// } fclose(fp); //初期データの並びの表示// for(i=0;i<10;i++) printf("[%d]=%d\n",i,a[i]); /*1.ソートすべきデータの中で最大のデータを見つけ、 2.そのデータを最後のデータと入れ替える。 最大データは配列のどこにあるのか⇒maxi              その値⇒max とする。*/ //データが10個の場合 int max,maxi,j; max=a[0],maxi=0; for(i = 0;i < 9; i++){ if(a[i + 1] > max){ max = a[i + 1]; maxi = i + 1; } swap(&a[maxi],&a[9-j]); for(j=0;j<9;j++){ printf("%d \n",j); printf("i=%d\n ",i); max=a[0], maxi=0; for(i=0;i<9-j;i++){ //最大値をもつデータ探索;(カウンタ変数) max++; //最大データと探索範囲最後のデータとの入れ替え: int n; n=maxi; maxi=max; max=n; printf("maxi=%d \n ",maxi); printf("i=%d\n ",i); printf("j=%d \n",j); } } if((fp=fopen("file.txt","wt"))==NULL){ printf("File open error.\n"); return 0; } for(i=0;i<100;i++){ fprintf(fp,"%d,",a[i]); } fclose(fp); } sortのソース #include<stdio.h> void swap (int *px,int *py); void swap (int *px,int *py) { int n; n =*px; *px = *py; *py = n; }

  • 単純挿入ソートについて

    単純挿入ソートの『選択』、『交換』、『挿入』の回数を出力せよ。という課題が出されたのですが意味がよくわかりません。ちなみに課題前に次のような説明をされました。 『選択』は交換と挿入を行うため、キー値等の比較を行う判定処理 『交換』は選択の結果、2つのキー値の並び替え処理 『挿入』は選択の結果、キー値を決められた並び順の位置に格納する処理 また、『選択』を『比較』、『交換』と『挿入』を合わせて『交換』と言う事もある。 作ったプログラムはこれです。かなり違う気がするので指摘よろしくお願いします。 void insertion(int a[], int n) /* a[]:ソート対象データが格納されている配列 n:データの個数 */ { int i,j; int tmp; int count[3]; /* 配列番号 選択:0 交換:1 挿入:2 */ for(i=1;i<n;i++) { tmp=a[i]; count[1]++; /* 交換カウント */ for(j=i;(j>0)&&(a[j-1]>tmp);j--,count[0]+=2) /* 選択カウント */ { a[j]=a[j-1]; count[1]++; /* 交換カウント */ } if(j > 0) /* 選択カウント */ count[0]+=2; else count[0]++; a[j]=tmp; count[2]++; /* 挿入カウント */ } printf("選択の回数 : %4d\n", count[0]); printf("交換の回数 : %4d\n", count[1]); printf("挿入の回数 : %4d\n\n", count[2]); } テストデータ 60 57 54 51 48 45 42 39 36 33 30 27 24 21 18 15 12 9 6 3 実行結果 選択の回数 : 399 交換の回数 : 209 挿入の回数 : 19

  • C言語をお願いします

    何が違うのか教えてください。 segmentation faultになります。 よく分からないので、プログラムを作っていただければ、助かります。 問 整数を入力し、降順並び変えてに表示。 ・入力した整数は配列に入れ、その配列を使って並び変える(入力終りの印は 1000 とする)。 ・入力する整数の個数は #define NUM 100 を使いなさい。 ・使うデータは、下記の例のように、キーボードから入力すること。 #include<stdio.h> #define NUM 100 int main(void){ int d[NUM]; int temp; int i,j,n; printf("Input scores.\n"); for(i=0; i<NUM && d[i]!=1000; i++){ scanf("%d",&d[i]); } n = i; for(i = 0; i < n; i++){ for(j = i + 1; j < n;j++){ if(d[j] > d[i]){ temp = d[i]; d[j] = d[i]; d[i] = temp; } } } printf("After sort."); for(i=0; i < n; i++){ printf("%d\n",d[i]); } return 0; } 実行例 Input scores. 60 30 45 90 100 0 1000 After sort. 100 90 60 45 30 0 よろしければ 問2 並び変えをする部分を mysort 関数にしたプログラムを作ってください。 main 関数から mysort 関数には点数の個数と sort 前の配列を渡し、並び変え結果の表示はmain 関数でお願いします。 (問題の意味が分かりません) 関数はさっぱり分かりません。 では、お願い致します。

  • C言語プログラムについて

    wikipediaのコムソートを参考に、次のように作りました。 動きますでしょうか。動かなければ、どこをどのようにすればよいか教えていただけませんでしょうか。 プログラム「#include<stdio.h> #include<string.h> void combsort(void); void swap(void); int main(void) { combsort(); swap(); printf("データ%dの並べ替え結果は、\n%d\nです。\n"data2,data); return 0; } void combsort(){ int h,swaps,data,len,data2; printf("ソートさせる数を入力。>\n"); scanf("%d",&data); data2 = data; len = strlen(data); h = len * 10 / 13; while(true){ swapa = 0; for(i = 0;i + h <len;i++) { if(data(i) > data(i + h)) { swap(data, i, i + h); swaps +=1; } } if(h==1){ if(swaps==0){ break; } } else{ h = h * 10 / 13; } } } void swap{ int a,i,j; const int t = a[i]; a[i] = a[j]; a[j] = t; } 」 data:scanfによって入力される並べ替えを行う数値(例:0219523056810)を代入。 data2:dataのコピーで、並べ替えを行う前のデータを保管しておくもの。 また、これの反対(これが、昇順なら、降順。降順なら、昇順。)を同じようにしたいと思います。(combsort2にて)どうすればよいでしょうか。 教えていただけませんでしょうか。 お早めのご回答お待ちしております。

  • ソートの名称について

    以下のようなソートに、選択ソートやバブルソート等といった名称は存在しますか? #include <stdio.h> int main(void) { int array[10]; int i, j, tmp; /* Input */ for(i=0; i<sizeof(array)/sizeof(int); i++){ printf("array[%d]> ", i); scanf("%d", &array[i]); } /* Sort */ for(i=0; i<sizeof(array)/sizeof(int)-1; i++){ for(j=i+1; j<sizeof(array)/sizeof(int); j++){ if(array[i]>array[j]){ tmp = array[i]; array[i] = array[j]; array[j] = tmp; } } } /* Output */ for(i=0; i<sizeof(array)/sizeof(int); i++){ printf("array[%d]: %d\n", i, array[i]); } return 0; }

  • ポインタを使ったソートプログラム

    #include<stdio.h> void swap(double *a,double *b) { double tmp; tmp=*a; *a=*b; *b=tmp; } void sort3d(double *pa,double *pb,double *pc) { if(*pa>*pb) { swap(pa,pb); } if(*pb>*pc) { swap(pb,pc); } if(*pa>*pc) { swap(pa,pc); } } int main(void) { double num1=3.14; double num2=2.97; double num3=0.01; sort3d(&num1,&num2,&num3); printf("d1の値=%.3d\n",num1); printf("d2の値=%.3d\n",num2); printf("d3の値=%.3d\n",num3); return 0; } ポインタを使ったソートプログラムを作ってみました。 ところが、コマンドプロンプトを使って動作させたら、 結果がうまく表示されませんでした。 どこがおかしいのか指摘していただけると嬉しいです。

専門家に質問してみよう