繁体   English   中英

强制 C 库 qsort 执行快速排序而不是合并排序

[英]Force C library qsort to perform a quicksort rather than a mergesort

我是 C 的新手,我正在阅读这篇文章: Killing Quicksort

它说:

对于那些在家玩的人要注意:如果 C 库认为计算机有足够的空闲 memory,则 GNU C 库 qsort function 实际上是归并排序; 要强制快速排序,请调用未声明的 _quicksort function 并使用 gcc -static 进行编译。

关于编译器选项,我使用 CMake 并将 cmake 标志设置为:

set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 -static")

但我不确定如何调用未声明的_quicksort

有人对这个有经验么?

使固定:

我刚刚像@recycler 建议的那样以这种方式声明了 _quicksort function:

void _quicksort(void *__base, size_t __nmemb, size_t __size,
        __compar_fn_t __compar);

它现在看起来像一个快速排序。 我是 C 的初学者,对我来说这似乎很神奇,但无论如何,我认为自己现在很满意。

您可以在 c 测试代码中声明函数“_quicksort”。 这应该与 qsort 相同。 现在您必须将它与应该由链接器自动完成的 c-lib 链接。 如果函数 _quicksort 已导出,则可以使用它,并且链接器会将其链接到您的二进制文件。 如果未导出,则会出现错误。

这是快速而肮脏的选择。 您还可以阅读 GNU C 库的源代码。 也许还有另一种选择。

请注意 - 你的里程可能会有所不同,但我只是测试了 glibc 版本的 _quicksort 和 mergesort 在所有不同的大小和 arrays 随机,顺序和反顺序。 mergesort 总是比 _quicksort 快 25%。 这可能就是他们更换它的原因。 ;)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM