如何在不使用排序算法的情况下将两个已排序的数组合并为第三个数组?

时间:2016-07-24 18:01:21

标签: c arrays algorithm merge

假设和限制:

  • 有两个数组按升序排序a []和b []不同大小。

  • 您必须按升序将它们合并到第三个数组c []中。

  • 您不能通过将两个数组合并到第三个数组中来合并它们,然后应用排序算法对它们进行排序。

  • 您不必在整个任务中使用任何排序算法。

  • 你应该利用a []和b []已经是排序数组的事实,它们可以合并而不必排序第三个数组c []

    SUGGESSIONS:

  • 如果您可以添加注释行以便于初学者理解,那就太棒了

  • 最好使用的编码语言应为C.(我也可以使用C ++和Java)

  • 我不会在这里提问或回答问题,所以请通过纠正或改进我的语言来帮助我更清楚。

1 个答案:

答案 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;
}

我通常更喜欢让调用者管理堆分配。