合并排序所需的打印时间

时间:2014-02-13 16:47:24

标签: c random time mergesort

我正在尝试打印计算机生成的随机数组合并排序所需的时间,其大小应在运行时从用户处获取,但它会产生分段错误。任何人都可以帮助纠正我的错误吗?

part(int arr[],int min,int max)
{
 int mid;
 if(min<max)
 {
   mid=(min+max)/2;
   part(arr,min,mid);
   part(arr,mid+1,max);
   merge(arr,min,mid,max);
 }
}


merge(int arr[],int min,int mid,int max)
{
  int tmp[30];
  int i,j,k,m; 
  j=min;
  m=mid+1;
  for(i=min; j<=mid && m<=max ; i++)
  {
     if(arr[j]<=arr[m])
     {
         tmp[i]=arr[j];
         j++;
     }
     else
     {
         tmp[i]=arr[m];
         m++;
     }
  }
  if(j>mid)
  {
     for(k=m; k<=max; k++)
     {
         tmp[i]=arr[k];
         i++;
     }
  }
  else
  {
     for(k=j; k<=mid; k++)
     {
        tmp[i]=arr[k];
        i++;
     }
  }
  for(k=min; k<=max; k++)
     arr[k]=tmp[k];
}

main(){
int x, *b, i;
double t5;
printf("array size = \t");
scanf("%d", &x);
b = (int)malloc(x*sizeof(int));
srand(time(NULL));
for(i = 0; i<x; i++)    b[i] = rand();
time_t t1 = 0;
time_t t2 = 0;
t1 = time(NULL);
part(b, 0, (x-1));
t2 = time(NULL);
printf("time taken for merge sort = %f sec\n", (t1 - t2));
}

2 个答案:

答案 0 :(得分:2)

这里的代码有几个问题:

  1. 缺少系统功能的所有相关原型,通过包含必要的标题来修复此问题。
  2. 根据merge()的需要,part()的原型丢失了。添加它。
  3. 不返回任何内容的函数应键入void。宣布他们一样。
  4. 无需投射malloc()的结果。 如果它已完成,则应该使用正确的类型:int *此处不是int
  5. 在大多数情况下,
  6. time_t是一个整数,因此如果在尝试打印double时不使用time_t的转换说明符,但是正确的整数转换说明符对于32位宽的time_t,d为64位宽ldtime_t。但是要打印time_t使用difftime()的差异,double中实际结果
  7. 最后,merge()中的临时缓冲区不会缩放。使max+1元素宽。

  8. #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void merge(int arr[], int min, int mid, int max);
    void part(int arr[], int min, int max);
    
    void part(int arr[], int min, int max)
    {
      int mid;
      if (min < max)
      {
        mid = (min + max) / 2;
        part(arr, min, mid);
        part(arr, mid + 1, max);
        merge(arr, min, mid, max);
      }
    }
    
    void merge(int arr[], int min, int mid, int max)
    {
      int tmp[max + 1];
      int i, j, k, m;
      j = min;
      m = mid + 1;
      for (i = min; j <= mid && m <= max; i++)
      {
        if (arr[j] <= arr[m])
        {
          tmp[i] = arr[j];
          j++;
        }
        else
        {
          tmp[i] = arr[m];
          m++;
        }
      }
      if (j > mid)
      {
        for (k = m; k <= max; k++)
        {
          tmp[i] = arr[k];
          i++;
        }
      }
      else
      {
        for (k = j; k <= mid; k++)
        {
          tmp[i] = arr[k];
          i++;
        }
      }
      for (k = min; k <= max; k++)
        arr[k] = tmp[k];
    }
    
    int main(void)
    {
      int x, *b, i;
    
      printf("array size = \t");
      scanf("%d", &x);
    
      b = malloc(x * sizeof(int));
    
      srand(time(NULL ));
      for (i = 0; i < x; i++)
        b[i] = rand();
    
      time_t t1 = 0;
      time_t t2 = 0;
    
      t1 = time(NULL);
      part(b, 0, x - 1);
      t2 = time(NULL);
    
      printf("time taken for merge sort = %f sec\n", difftime(t2, t1));
    }
    

答案 1 :(得分:1)

time使用名为time_t的类型。要用它来查找经过的时间(以秒为单位),您必须执行以下操作:

time_t time1, time2;
double seconds;

time(&time1);
...
time(&time2);

seconds = difftime(time2, time1);

此外,从malloc中删除演员表。 malloc返回一个void指针,该指针隐式地转换为int指针:

b = malloc(x * sizeof(*b));