質問内容
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
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。