C中标准库的qsort函数的复杂性是多少? 如果可能,请提供参考。
#include <stdlib.h>
void qsort(void *base, size_t nmemb, size_t size,
int (*compar)(const void *, const void *));
答案 0 :(得分:7)
根据cppreference.com,这是关于C语言文档的一个相当可靠的来源:
尽管名称不同,但C和POSIX标准都不要求使用quicksort实现此功能,也不需要做出任何复杂性或稳定性保证。
我有一份C ISO标准草案,其中说明了以下qsort
:
qsort函数对nmemb对象的数组进行排序,其初始元素由base指向。每个对象的大小由大小指定。
根据比较,数组的内容按升序排序 compar指向的函数,用两个指向的参数调用 被比较的对象。该函数应返回小于,等于或的整数 如果第一个参数被认为分别小于,等于,则大于零 或者大于第二个。
如果两个元素相等,则它们在生成的排序数组中的顺序是未指定的。
返回:
qsort函数不返回任何值。
这支持参考网站所说的内容,因为这里没有提到任何复杂性保证。
总的来说,你不能假设运行时平均为O(n log n)或最坏情况。有一些实现的历史使用启发式算法,在最坏的情况下会退化;搜索“Quicksort的杀手对手”了解详情。
在最坏的情况下,将此与C ++ std::sort
,which is guaranteed to run in time O(n log n)进行对比。