【发布时间】:2021-06-23 17:59:44
【问题描述】:
我正在尝试编写一个程序,该程序从 CSV 文件中获取一些歌曲数据(约 1000 行)并将其放入结构数组中。该 CSV 文件中的每一行都包含:title of the song、artist 和 release 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 慢,这就是我感到困惑的原因。
如果您需要我提供更多代码,请发表评论,我会做的。非常感谢!
【问题讨论】:
-
快速排序通常比冒泡排序快。快速排序平均 O(n log n),冒泡排序是 O(n^2)。
-
尝试使用更大的数组进行测试。
-
您不能真正使用
clock()来比较如此短的时间跨度,因为它的粒度。这是一个钝器。 -
你没有答案吗?您可以制作较慢的排序函数,但冒泡排序是常用函数中性能最差的。
qsort快得多,以至于clock()的时间测量为0。在 MS Visual Cclock()上以 1/1000 秒计(在 Linux 上可能更小)。该标准没有说明其分辨率,我记得大约是 1/18 秒。struct包含的其他内容无关紧要,因为您正在比较int成员并交换 指针。
标签: c clock qsort time.h time-t