【发布时间】:2022-01-26 14:08:00
【问题描述】:
我是一名 C 初学者,我正在尝试编写一个 merge_sort 函数。我在下面写了我的代码。
变量“array_global”是数组“a”和数组“b”之间的合并,所有合并过程都可以正常工作,当函数返回“array global”时会出现问题,因为它似乎只返回第一个数组的元素。
例如,如果“array_global”为[19, 26],则接收函数结果的整数指针“a”只接收[19]
我做错了什么? 为什么会这样?
提前谢谢
int *merge_sort(int array[], int len)
{
if (len == 1)
{
return array;
}
else
{
int l1 = (len/2);
int l2 = len - l1;
int sub_array_1[l1]; int sub_array_2[l2];
for (int i = 0; i<l1; i++)
{
sub_array_1[i] = array[i];
}
for (int i = l1; i<len; i++)
{
sub_array_2[i-l1] = array[i];
}
int *a = merge_sort(sub_array_1, l1);//Receives array_global value
int a_size = (sizeof(a)/sizeof(int));
int *b = merge_sort(sub_array_2, l2);//Receives array_global value
int b_size = (sizeof(b)/sizeof(int));
int mult = a_size + b_size;
int *array_global = malloc(sizeof(*array_global)*mult);
merge(a, b, a_size, b_size, array_global);
return array_global;
}
}
【问题讨论】:
-
这里有一堆内存泄漏,因为在每个递归步骤中,你分配了一个你永远不会释放的临时数组。
-
你如何确定结果只包含
[19]? -
您可以就地进行整个排序(即将输出存储在输入数组中)。随后,该函数不需要返回任何内容。
-
@bbbbbbbbb:如果你能写一个合并排序,我想知道。这是本书显示副本的少数算法之一。请注意,您只需要一个额外的缓冲区并且可以振荡。
-
@bbbbbbbbb 如果指针作为另一个函数的参数传递,是否可以释放指针中分配的内存?我正在考虑在“合并”函数中释放指针“array_global”,但如果可能的话,我会考虑。我也想知道,如果你不返回任何值,你不能做一个递归函数吗?
标签: arrays c pointers recursion mergesort