我写了一个“插入”函数来将整数插入到整数数组中。它有效,但我不知道它是否是最好的算法。
这是我的代码:
int* insert(int *dest, size_t len, unsigned int index, int value)
{
int x = 0, i = 0;
int *stackp = calloc(len+1, sizeof(int));
if(index > (len-1)) return dest;
while(x < len) {
if(x == index) {
++x;
} else {
*(stackp+x) = *(dest+i);
++x, ++i;
}
}
*(stackp+index) = value;
free(dest);
dest = stackp;
return dest;
}
答案 0 :(得分:5)
您的内存分配存在重大错误。 stackp
是一个自动(堆栈)数组,这意味着它的生命周期在插入返回后立即结束。您必须使用其他分配方法。您可以让调用者分配一个新数组并传入两个指针,或者您可以使用malloc
自己完成(不要忘记免费)。
然而,其余的看起来都很好。这几乎是非就地插入的唯一算法。使用特殊技巧(例如,一次复制两个整数),您可以更快地完成它。 memmove
和memcopy
可能会在某些体系结构上使用此类优化。
此外,许多算法会在找到位置时写入stackp[index]
,而不是在结尾时写入realloc
。但核心算法基本相同。
另一种方法是就地插入(仅在插入位置后移动元素),而不是使用新数组。您经常会使用malloc
进行扩展。在许多情况下这是首选,因为它可以节省复制时间并避免{{1}}新的内存位置(也可能使堆碎片化)。
最后,替代数据结构完全是链表。这完全消除了复制元素的需要,但使用更多内存并防止随机访问。
答案 1 :(得分:2)
这里有一个严重的错误。数组stackp是一个局部变量,您将返回它作为结果。如果要在“插入”功能之外再次读取/写入该数组,则可能会出现分段错误。
要纠正它,您需要分配一个动态数组,如:
int *stackp;
stackp = (int*)malloc(size(int)*(len+1));