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

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

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

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

ソート

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

3回答

809閲覧

mergesortの時間計測で0.0000になってしまう

grape_ll

総合スコア83

C

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

ソート

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/07/26 00:39

質問内容

C言語でmergesortを行い,整列したデータとランダムなデータのソート時間を計測しようと思ったのですが,思った通りに動いてくれません.mergesortは適切に動くので問題ないです.具体的に問題点を述べると,コードの提出先ではなぜかclock()が使えないので,推奨されていないgettimeofdayを使用せざるをえないのですが,以下のコードでfor文の数列の表示を行わないと計測時間が0.00000となってしまい,問題では時間の表示しか行わないので適切な表示となってくれません.mergesort関数だけの時間を測るにはどのようにすればよいか教えていただきたいです.

コード

C

1#include<stdio.h> 2#include<time.h> 3#include<sys/time.h> 4#define maxN 10000 5int aux[maxN]; 6void merge(int a[],int l,int m,int r){ 7 int i,j,k; 8 for(i=m+1;i>l;i--) aux[i-1]=a[i-1]; 9 for(j=m;j<r;j++) aux[r+m-j]=a[j+1]; 10 for(k=l;k<=r;k++){ 11 if(aux[i]<aux[j]){ 12 a[k]=aux[i++]; 13 }else{ 14 a[k]=aux[j--]; 15 } 16 } 17} 18 19void mergesort(int a[],int l,int r){ 20 int m=(r+l)/2; 21 if(r<=l) return; 22 //printf("start\n"); 23 mergesort(a,l,m); 24 mergesort(a,m+1,r); 25 merge(a,l,m,r); 26} 27 28int main(void){ 29 int num; 30 scanf("%d",&num); 31 32 int a[10000]; 33 int b[10000]; 34 int i; 35 char str[50]; 36 37 struct timeval time1; 38 struct timeval time2; 39 float diff_time; 40 41 clock_t start,end; 42 43 scanf("%s",str); 44 45 for(i=0;i<num;i++){ 46 scanf("%d",&a[i]); 47 } 48 scanf("%s",str); 49 for(i=0;i<num;i++){ 50 scanf("%d",&b[i]); 51 } 52 53 //printf("mergesort starts\n"); 54 55 gettimeofday(&time1,NULL); 56 //start=clock(); 57 mergesort(a,0,num-1); 58 59 for(i=0;i<num;i++){ 60 printf("%d\n",a[i]); 61 } 62 63 //end=clock(); 64 gettimeofday(&time2,NULL); 65 66 diff_time=time2.tv_sec-time1.tv_sec+(float)(time2.tv_usec-time1.tv_usec)/1000000; 67 printf("%f\n",diff_time); 68 //printf("%fsec\n",(double)(end-start)/CLOCKS_PER_SEC); 69 70 //start=clock(); 71 gettimeofday(&time1,NULL); 72 mergesort(b,0,num-1); 73 74 for(i=0;i<num;i++){ 75 printf("%d\n",b[i]); 76 } 77 78 //end=clock(); 79 gettimeofday(&time2,NULL); 80 //printf("%fsec\n",(double)(end-start)/CLOCKS_PER_SEC); 81 diff_time=time2.tv_sec-time1.tv_sec+(float)(time2.tv_usec-time1.tv_usec)/1000000; 82 printf("%f\n",diff_time); 83 84 //printf("mergesort finished\n"); 85 /* 86 for(i=0;i<num;i++){ 87 printf("%d\n",a[i]); 88 } 89 */ 90} 91

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

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

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

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

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

guest

回答3

0

printf("%f\n",diff_time); の %f を %.15g にしたらどうなりますか?

投稿2020/07/27 01:06

kazuma-s

総合スコア8224

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

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

0

ベストアンサー

こちらで確認してみました。
データを10件入力して(10~19)、0.000193秒でした。
vmwareでcentos7.5の環境で実施しています。CPUはcore i5です。
こちらのマシンが遅いのかも知れません。
あなたのマシンが速すぎて0.000000が表示されている可能性も考えられます。
データ件数は何件でおこなっていますか。最低でも10件以上は必要かと思われます。

投稿2020/07/26 02:52

tatsu99

総合スコア5438

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

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

grape_ll

2020/07/27 00:50

データセットが少ないだけでコード的には問題ないということでしょうか.
tatsu99

2020/07/27 02:01

はい。時刻計測については、こちらで期待した結果が出ていますので、問題ないかと思います。 念のため、意図的に1秒、スリープしたあとで、終了時刻を計測してみてはいかがでしょうか。 sleep(1); gettimeofday(&time2,NULL); のようにすればよいかと。 (unistd.hのincludeが必須です)
grape_ll

2020/07/27 02:19

そうなのですね,わざわざ検証までしていただきありがとうございます.
guest

0

diff_time=(float)time2.tv_sec-time1.tv_sec+(float)(time2.tv_usec-time1.tv_usec)/1000000;

とやってみればどうでしょう

投稿2020/07/26 00:56

y_waiwai

総合スコア87774

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

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

grape_ll

2020/07/26 02:20

gettimeofday(&time1,NULL); //start=clock(); mergesort(a,0,num-1); /* for(i=0;i<num;i++){ printf("%d\n",a[i]); } */ //end=clock(); gettimeofday(&time2,NULL); diff_time=(float)(time2.tv_sec-time1.tv_sec)+(float)(time2.tv_usec-time1.tv_usec)/1000000; printf("%f\n",diff_time); としてみましたが結果は変わらず,0.000000でした. 他にも何か改善点等はありますでしょうか.よろしくお願いいたします。
y_waiwai

2020/07/26 02:27

time2.tv_secやtime1.tv_secのそれぞれの数値はどうなってますか?
grape_ll

2020/07/26 06:19

gettimeofday(&time1,NULL); mergesort(b,0,num-1); /* for(i=0;i<num;i++){ printf("%d\n",b[i]); } */ //end=clock(); gettimeofday(&time2,NULL); //printf("%fsec\n",(double)(end-start)/CLOCKS_PER_SEC); diff_time=(float)(time2.tv_sec-time1.tv_sec)+(float)(time2.tv_usec-time1.tv_usec)/1000000; printf("t1.s:%f\nt1.u:%f\nt2.s:%f\nt2.u:%f\n",time1.tv_sec,(float)time1.tv_usec/1000000,time2.tv_sec,(float)time2.tv_usec/1000000); printf("%f\n",diff_time); のとき t1.s:805639964304379.870000 t1.u:1489622900362035800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 t2.s:0.270881 t2.u:0.000000 0.000000 gettimeofday(&time1,NULL); mergesort(b,0,num-1); for(i=0;i<num;i++){ printf("%d\n",b[i]); } //end=clock(); gettimeofday(&time2,NULL); //printf("%fsec\n",(double)(end-start)/CLOCKS_PER_SEC); diff_time=(float)(time2.tv_sec-time1.tv_sec)+(float)(time2.tv_usec-time1.tv_usec)/1000000; printf("t1.s:%f\nt1.u:%f\nt2.s:%f\nt2.u:%f\n",time1.tv_sec,(float)time1.tv_usec/1000000,time2.tv_sec,(float)time2.tv_usec/1000000); printf("%f\n",diff_time); のとき 2 4 8 18 22 t1.s:-0.000000 t1.u:1489565147789112600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000 t2.s:0.139946 t2.u:0.000000 0.020946 となりました.
y_waiwai

2020/07/26 06:22

printf("t1.s:%f\nt1.u:%f\nt2.s:%f\nt2.u:%f\n",time1.tv_sec, じゃなく、 printf("t1.s:%ld\nt1.u:%ld\nt2.s:%ld\nt2.u:%ld\n",time1.tv_sec, としてだしてみてください
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問