clock() 函数不测量 qsort() 时间

问题描述

我正在尝试编写一个程序,该程序从 CSV 文件中获取一些歌曲数据(~1000 行)并将其放入结构数组中。该 CSV 文件中的每一行都包含:title of the songartistrelease year。字符串、字符串和整数。

取出数据没有问题。

这些行在我的结构数组(称为 s)中正确写入,而且 bubblesort 部分工作正常。计算冒泡排序的执行时间也有效。我把那段时间写在记忆里。

之后我将重置数组,并将数据再次插入到数组结构中。我正在使用 qsort() 对数组进行排序。该函数执行它打算做的事情。数组的排序方式与 bubblesort 的排序方式相同。问题是,测量的时间是 0,000...

这是我的 bubblesortTime() 函数,它返回冒泡排序所需的执行时间......排序:

float bubbleSortTime(song *s,int length) {
    int flag;
    song aux;

    clock_t start,end;

    start = clock();

    do {
        flag = 0;
        for (int j = 0; j<length-1; j++) {
            if (s[j].release_year > s[j+1].release_year) {
                aux = s[j];
                s[j] = s[j+1];
                s[j+1] = aux;
                flag = 1;
            }
        }
    } while (flag == 1);

    end = clock();

    clock_t time = end-start;
    float finTime = (float)time/CLOCKS_PER_SEC;


    return finTime;
}

还有,那是我的 qsortTime() 函数,连同 comp()

int comp (const void * a,const void * b)
{
    song *s1 = (song *)a;
    song *s2 = (song *)b;

    return (s1->release_year - s2->release_year);
}

float qsortTime(song *s,int length) {

    clock_t start,end;

    start = clock();

    qsort(s,length,sizeof(s[0]),comp);

    end = clock();

    clock_t time = end-start;
    float finTime = (float)time/CLOCKS_PER_SEC;

    return finTime;
}

main()中显示两个返回值时,使用:

float time1 = bubbleSortTime(s,i);

/** 
reset code and more things here
**/

float time2 = qsortTime(s,i);
printf("%f %f",time1,time2);

(...) 输出为:0.062500 0.000000,说明 bubblesort 调用的时间已正确计算,而 qsort 调用的时间未正确计算.

我知道 qsort 通常比 bubblesort 慢,所以我很困惑。

如果您需要我提供更多代码,请发表评论,我会做的。非常感谢!

解决方法

使用更大的 N。

首先尝试使用较大的 N 只锻炼 qsortTime()

当 N = 100,000 并且报告的时间为“0.062500 0.000000”和 O(n*n) vs O(n*log n) 时,2 种算法之间的时间差可以超过 1000 倍。

对我来说,N = 100,000

Bubble: 47.125
QTSort: 0.016

另外,请确保“重置代码和更多内容”包括给 qsortTime(s,i); 一个未排序的列表,而不是按 bubbleSortTime() 排序的列表。

示例

#define SS (100000 * 2)
song s[SS];

int main() {
  // for (int i = 0; i < SS; i++)
  //  s[i].release_year = rand() % 1000;
  // printf("Bubble: %g\n",bubbleSortTime(s,SS));
  for (int i = 0; i < SS; i++)
    s[i].release_year = rand() % 1000;
  printf("QTSort: %g\n",qsortTime(s,SS));
}

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...