所以,我在我的C程序中使用了C库中的qsort。它按预期工作,所以我决定尝试比较器。
比较器1(我使用这个):
int compare (const void * a, const void * b)
{
if (*(double*)a > *(double*)b) return 1;
else if (*(double*)a < *(double*)b) return -1;
else return 0;
}
比较器2:
int comp (const void *a, const void *b)
{
const double *ia = (const double *)a; // casting pointer types
const double *ib = (const double *)b;
return *ia - *ib;
}
第一个代码按照我的预期工作。第二个代码应该和第一个一样。我想使用第二个代码因为程序运行速度稍快,但问题是它并没有真正排序任何东西!我相信我之前在较小的数组上使用过比较器#2并且它也起作用了。除非我漏掉了什么。
qsort()
函数通过指针调用比较器的开销,除非在极为特定的情况下,否则很难相信这种棘手的“优化”比较器即使被更正以实际工作也能显著提高性能。这个简单函数的性能可能会被那个开销主导。 - Michael Burrreturn *ia - *ib;
替换为double diff = *ia - *ib; return *(int*)((char*)&diff+4);
并查看其性能。这非常依赖于具体实现,不完整且不建议使用,但在小端字节序且 sizeof(int) = 4 的情况下应该可以工作。它只返回diff
的最高 32 位字,应该设置符号位。还假设该字的位内容对于正差异不为零。 - nnn