简单地使用指向C数组中间的指针来拆分它是不是一种糟糕的做法



我正在c中实现一个版本的合并排序。第一步,我必须将数组拆分为子数组。

简单地用两个指针来做这件事,一个指向原始数组的开头,另一个指向中间,这是不是一种糟糕的做法?

或者我应该malloc 2个新的内存插槽,在这里复制适当的值,然后保留一个指向这个空间的指针?

如果你知道自己在做什么,我不认为这是一种糟糕的做法。在某些情况下,为了效率而牺牲可读性。如果你只想再创建两个数组,可能会更清楚,但如果你对数组和指针有很好的把握,为什么要分配额外的内存?

绝对不是!用C编程的全部意义在于能够完成这些巧妙的指针技巧!

但是,请注意,mergesor并没有到位,所以您仍然需要malloc一个辅助数组。如果你做了正确的指针技巧,你只需要malloc一次,然后重用它。

在这种情况下使用一个数组(如合并排序)是很好的。调用malloc是不必要的,除非数组的大小对于堆栈来说太大。

通常使用合并排序时,您希望将合并结果放入原始输入占用的内存中。如果是,那么您应该:

  • 对两半进行排序
  • 将数组的"下半部分"复制到新分配的缓冲区中,保留"上半部分"
  • 从上半部分和额外的缓冲区合并到大数组的"底部"

这样,您只需要分配与输入大小的一半一样多的额外内存。您甚至可以在一开始就这样做一次,并将相同的缓冲区重新用作要进行的所有合并的工作空间。

不,这还不错,事实上,我认为这是最初使用C的唯一原因之一。如果每次需要以稍微不同的方式处理相同的数据时,都要对数据进行浪费性的复制,那么您已经调用了高级脚本语言的最大成本之一。您还大幅增加了代码必须进行的错误处理量(因为分配可能会失败),并且由于C中的错误处理往往有点"冗长"(善意地说),因此净复杂性成本远比访问子数组的轻微复杂性成本差。

相关内容

最新更新