我在c中实现了一个合并排序版本。对于第一步,我必须将数组拆分为子数组。
通过使用两个指针来简单地执行此操作是不好的做法,一个指向原始数组的开头而第二个指向中间?
或者我应该malloc 2个新的内存插槽,在这里复制适当的值,然后保持指向这个空间的指针?
答案 0 :(得分:12)
如果你知道自己在做什么,我认为这不是一种不好的做法。在某些情况下,您牺牲了可读性以提高效率。如果你只是再创建两个数组,可能会更清楚,但如果你对数组和指针有一个牢固的把握,为什么要分配额外的内存呢?
答案 1 :(得分:11)
绝对不是! C语言中的整个编程点就是能够做出这些巧妙的指针技巧!
请注意,mergesort不在位,因此您仍需要malloc辅助数组。如果你做了正确的指针技巧,你可以只使用malloc一次并重复使用它。
答案 2 :(得分:2)
在这种情况下使用一个数组(合并排序)就可以了。除非数组的大小对于堆栈来说太大,否则调用malloc是不必要的。
答案 3 :(得分:2)
通常使用合并排序,您希望将合并的结果放入原始输入占用的内存中。如果是这样,那么你应该:
这样,您只需要分配与输入大小 half 一样多的额外内存。您甚至可以在开始时执行此操作,并将相同的缓冲区重新用作您将要执行的所有合并的工作空间。
答案 4 :(得分:1)
不,这不错,事实上我认为这是首先使用C的唯一原因之一。如果您每次需要稍微区别对待相同的数据时都要浪费数据副本,那么您已经调用了高级脚本语言的最大成本之一。您还大大增加了代码必须执行的错误处理量(因为分配可能会失败),并且由于C中的错误处理往往有点“冗长”(使其友好),因此净复杂性成本更差而不是在原地访问子阵列的轻微复杂性成本。