【问题标题】:printing time taken for merge sort合并排序所需的打印时间
【发布时间】:2014-03-12 16:35:01
【问题描述】:

我正在尝试在计算机生成的随机数数组上打印合并排序所花费的时间,其大小应在运行时从用户处获取,但它给出了分段错误。谁能帮助纠正我的错误?

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));
}

【问题讨论】:

  • 确切的错误是什么?
  • 为什么要将 b 转换为 int,而它应该是 int*?
  • @gregkow 更好的是,完全移除演员表。
  • 我确实将 b 声明为“int *b”,但我遇到了分段错误
  • @user3248186 分段错误到底在哪里。什么行、语句等?

标签: c random time mergesort


【解决方案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));

【讨论】:

  • 即使我移除演员表并使用 difftime(t1, t2),它也给出了相同的结果 - 分段错误
  • @user3248186 将确切的错误复制并粘贴到您的问题中。
  • 在我删除 malloc 之前的演员表之后,它既没有显示错误也没有警告,它只是给出了大于 35 的数组大小的“分段错误”。
  • 推荐difftime(time2, time1);
  • 可悲的是 OP 也反转了 (t1 - t2).
【解决方案2】:

这里的代码有几个问题:

  1. 系统功能的所有相关原型都缺失,请通过包含必要的标头来解决此问题。
  2. merge() 的原型缺失,part() 需要。添加它。
  3. 不返回任何内容的函数应输入为void。声明它们是一样的。
  4. 不需要转换malloc() 的结果。 如果完成了,应该使用正确的类型:int * 这里不是int
  5. time_t 在大多数情况下是一个整数,所以如果它在尝试打印time_t 时不要使用double 的转换说明符,而是正确的整数转换说明符是d 用于32 位宽time_t或 ld 用于 64 位宽 time_t。但是,要打印 time_ts 的差异,请使用 difftime(),实际上 resultsdouble 中。
  6. 最后一点,merge() 中的临时缓冲区无法扩展。将其设为 max+1 元素宽。


#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));
}

【讨论】:

  • 尚未遇到time_t 不是整数的平台,但 C 规范未指定它必须是整数。假设一个整数,转换差异是一种合理的方法,如printf("time = %lld\n", (long long) (t2 - t1));printf("time = %jd\n", (intmax_t) (t2 - t1));
  • @chux:是的,你是对的,time_t 甚至可以是 struct 或其他... - 调整了我的措辞。
  • 彻底诊断。 +1
猜你喜欢
  • 2021-12-09
  • 1970-01-01
  • 2023-01-19
  • 1970-01-01
  • 2013-12-29
  • 1970-01-01
  • 2018-03-08
  • 1970-01-01
  • 2021-11-11
相关资源
最近更新 更多