- 締切済み
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秒だと思うんですが合ってますか?連続質問ですいません。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- kmee
- ベストアンサー率55% (1857/3366)
前回の説明の通り。 実感と合わないのは、おそらく、clock関数で求まる時間が「CPU時間」等と呼ばれるもので、実際に経過した時間では無いから。 ※ それでも、2分はかかって無いはず。ストップウオッチ片手に測定してみれば? Linux等では、clock()はCPUの動作時間が返ります。 これには、CPUが待機している時間は含まれません。 CPUが待機している時間には、次のようなものがあります。 ・ファイルに書き込む命令を実行してから、実際に書き込まれるまでの待ち時間。 ・ファイルから読み込む命令を実行してから、実際に読み込まれるまでの待ち時間。 ・画面の文字を出力する命令を実行してから、実際に表示されるまでの待ち時間。 ・バックグラウンドで動作している他のプログラムがCPUパワーを使っていて、全体に重くなっている。 これらの時間が長い程、clock()で求めた時間と、実際にかかった時間との差が大きくなります。 前回も書きましたが、このプログラムが「遅い」のは、いちいち交換結果を出力しているからです。 printfで整形する時間も長いですが、それ以上に、出力時の待ち時間がとても長いです。 上記のように、この待ち時間はclock()に含まれていない可能性が高いです。
- akayoroshi
- ベストアンサー率50% (46/91)
質問の回答ではありませんが、 このBubbleSort関数はバブルソートを行う関数ではありません。(この関数のソートは安定ソートではありません。 もう一つ、ソートだけの所要時間を計るには start=clock(); の位置が不適切です。
- wormhole
- ベストアンサー率28% (1626/5665)
>単位が分かりません。教えてください。自分の答えとしては2分55秒だと思うんですが合ってますか?連続質問ですいません。 http://okwave.jp/qa/q8181643.html の#2でちゃんと説明してくれてますけどマニュアルちゃんと読んでますか?