C中的qsort使用两倍的内存量

时间:2017-02-07 09:39:24

标签: c memory memory-management quicksort qsort

我有一个程序,我需要读取RAM中的数据字节,使用qsort对数据进行排序,然后将数据写回文件,问题是我只允许使用一定量的内存来这样做。 这是我所做过的一件事:

FILE *fp;
/* open file for reading up here , blah blah blah*/
...

int mb = 1024*1024;
int mem_size = 20*mb;
int total_cookies = mem_size/sizeof(Cookie);
Cookie *buffer = (Cookie *) calloc(total_cookies, sizeof(Cookie));

/* read bytes into buffer*/
 while ((result = fread(buffer, total_cookies , sizeof(Cookie), fp)) > 0) {
      qsort(buffer, total_cookies, sizeof(Cookie), compare);
      fwrite(....)
 }
 free(buffer);

我的问题是,当我针对/usr/bin/time -v运行我的程序并检查最大驻留集大小时,我使用的内存量是我想要的两倍,问题指向qsort函数。

如何让qsort进行排序,而不是使用额外的内存?

1 个答案:

答案 0 :(得分:4)

由于规范中没有关于内存消耗或时间复杂度的要求,如果您对内存消耗有限制(至少如果您想要可移植性),则需要使用另一个函数(可能是自己实现的)。

确实存在具有O(n log n)复杂度和O(n log n)内存消耗的算法(fx快速排序)。实际上可能有一些实现使用这样的算法来实现qsort,但是你的这些算法可能都不是。

还有其他不错的算法需要更多内存。例如,合并排序需要为最后一个合并步骤制作数据的副本(这与您的观察一致)。合并排序具有它的优点(例如具有更好的最坏情况时间复杂度),这可能是实现选择该算法的原因。

实际上qsort的实施可能比时间和记忆方式都差很多。 qsort到位的声明仅在结果最终与输入在同一数组中结束的范围内才是真实的,但在此之前它可以将数据分散到整个地方。