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

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

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

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

Q&A

解決済

1回答

2214閲覧

ソートの時間計算量を比較したいのですがうまくいきません。

sort_merge

総合スコア16

C

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

0グッド

0クリップ

投稿2016/01/01 06:07

選択法や挿入法、マージソートやクイックソートの時間計算量の比較をしたいのですが、思うように時間計算量を出すことができません。

自分が書いた選択法のソースです。

#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #define MAX 1000000 int main(){ int arrey[MAX],t = MAX; int inputdata(); struct timeval start_timeval, end_timeval; double sec_timeofday; gettimeofday( &start_timeval, NULL); int SelectionSort(); gettimeofday( &end_timeval, NULL); sec_timeofday = (end_timeval.tv_sec - start_timeval.tv_sec) + (end_timeval.tv_usec - start_timeval.tv_usec)/ 1000000.0; int printdata(); printf("処理時間0(%f)",sec_timeofday); } int inputdata(int t,int arrey[]){ int i; srand((unsigned)time(NULL)); printf("適当に並べられた数列-------\n"); for(i=0; i<=t; i++){ arrey[i] = (rand()%100+1); printf("arrey[%d]=%d\t",i,arrey[i]); } return(0); } int SelectionSort(int t,int arrey[]){ int p,q,x,y,min; for(p=0; p<=t-1; p++){ min=p; x=arrey[min]; for(q=p+1; q<=t; q++){ if(arrey[min]>arrey[q]){ arrey[min]=arrey[q]; y=q; } } arrey[p]=arrey[min]; arrey[y]=x; } return(0); } int printdata(int t,int arrey[]){ int g; printf("\n選択法の結果----------\n"); for(g=0; g<=t; g++) printf("arrey[%d]=%d\t",g,arrey[g]); return(0); } コード

このソースを実行すると、時間計算量が0.000000や0.000001という感じで表示されてしまいます。

乱数を使ってデータの入力をしたのですが、データの入力がされてないように思えます。

アドバイスどうかお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C

1int inputdata(); 2 3int SelectionSort(); 4 5int printdata();

main関数内のこれらの記述は「関数プロトタイプ宣言」とみなされて、関数呼び出しは行われません。余計なintを外してください。各関数の実装を見ると戻り値に意味はなさそうなので、voidにしてしまった方が良いかもしれません。
また、それだけだとコンパイルが通らないので、**「main関数の前」**で上記関数のプロトタイプ宣言を記述してください。


関数プロトタイプ宣言

C

1void inputdata(int t,int arrey[]); 2void SelectionSort(int t,int arrey[]); 3void printdata(int t,int arrey[]);

関数呼び出し

C

1inputdata(t, arrey); 2 3SelectionSort(t, arrey); 4 5printdata(t, arrey);

投稿2016/01/01 07:05

編集2016/01/01 07:48
catsforepaw

総合スコア5938

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

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

sort_merge

2016/01/01 07:38

#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #define MAX 100000 void inputdata(); void SelectionSort(); void printdata(); int main(){ int arrey[MAX],t = MAX; inputdata(); struct timeval start_timeval, end_timeval; double sec_timeofday; gettimeofday( &start_timeval, NULL); SelectionSort(); gettimeofday( &end_timeval, NULL); sec_timeofday = (end_timeval.tv_sec - start_timeval.tv_sec) + (end_timeval.tv_usec - start_timeval.tv_usec)/ 1000000.0; printdata(); printf("処理時間0(%f)",sec_timeofday); } void inputdata(int t,int arrey[]){ int i; srand((unsigned)time(NULL)); printf("適当に並べられた数列-------\n"); for(i=0; i<=t; i++){ arrey[i] = (rand()%100+1); printf("arrey[%d]=%d\t",i,arrey[i]); } return; } void SelectionSort(int t,int arrey[]){ int p,q,x,y,min; for(p=0; p<=t-1; p++){ min=p; x=arrey[min]; for(q=p+1; q<=t; q++){ if(arrey[min]>arrey[q]){ arrey[min]=arrey[q]; y=q; } } arrey[p]=arrey[min]; arrey[y]=x; } return; } void printdata(int t,int arrey[]){ int g; printf("\n選択法の結果----------\n"); for(g=0; g<=t; g++) printf("arrey[%d]=%d\t",g,arrey[g]); return; } このように書き直してみたら、実行結果がおかしくなってしまいました。 何度実行しても、 適当に並べられた数列--------- Segmentation fault: 11 このような結果が出てしまいます。 どこを直したら良いか教えていただきたいです。 何度も申し訳ありません。
catsforepaw

2016/01/01 07:54 編集

ちょっと書き方が足りなかったですかね。 「関数プロトタイプ宣言」は、実際の関数に合わせて(コピペして)ください。 それと、関数呼び出しには「引数」を指定してください。 上記、回答の方に追記しました。
sort_merge

2016/01/01 08:01

自分で手を加えてみた結果処理時間的な結果が出てきました。 以下は手を加えてみた部分です。 inputdata(t,arrey); SelectionSort(t,arrey); printdata(t,arrey); mainのあとのinputdata等の()に追加してみました。 処理時間は0(11.820917) このように表示されたのですが、この結果をどうグラフに反映させたらよいか教えていただけないでしょうか。
catsforepaw

2016/01/01 08:19

どういうグラフを作りたいのかが判らないのでなんとも答えられないのですが……。 それに、グラフ作りとなると本件のご質問の範疇からは外れますので、まずはどういうことをしたいのかを明確にしてプログラムの実行結果から得られた情報をどう使うのかを考え、もし判らないことがあれば新たに質問した方がよろしいかと思います。
sort_merge

2016/01/02 02:27

わかりました。 細かいことまで教えていただき本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問