假设和限制:
有两个数组按升序排序a []和b []不同大小。
您必须按升序将它们合并到第三个数组c []中。
您不能通过将两个数组合并到第三个数组中来合并它们,然后应用排序算法对它们进行排序。
您不必在整个任务中使用任何排序算法。
你应该利用a []和b []已经是排序数组的事实,它们可以合并而不必排序第三个数组c []
SUGGESSIONS:
如果您可以添加注释行以便于初学者理解,那就太棒了
最好使用的编码语言应为C.(我也可以使用C ++和Java)
我不会在这里提问或回答问题,所以请通过纠正或改进我的语言来帮助我更清楚。
答案 0 :(得分:2)
我猜你找到了例子here(请引用链接!),但这有点复杂。我更喜欢以下内容:
// c[] MUST be pre-allocated to at least n_a+n_b
void merge_sorted(int n_a, const int a[], int n_b, const int b[], int c[])
{
int i = 0, j = 0, k = 0;
while (i < n_a && j < n_b)
if (a[i] < b[j]) c[k++] = a[i++];
else c[k++] = b[j++];
while (i < n_a) c[k++] = a[i++];
while (j < n_b) c[k++] = b[j++];
}
但它不会检查输入是否已排序。
编辑:函数内部具有堆分配的版本:
// the caller is responsible for calling free() on the returned pointer
int *merge_sorted(int n_a, const int a[], int n_b, const int b[])
{
int i = 0, j = 0, k = 0, *c;
c = (int*)malloc((n_a + n_b) * sizeof(int));
while (i < n_a && j < n_b)
c[k++] = a[i] < b[j]? a[i++] : b[j++];
while (i < n_a) c[k++] = a[i++];
while (j < n_b) c[k++] = b[j++];
return c;
}
我通常更喜欢让调用者管理堆分配。