将2个数组的排序合并到C中的第三个数组中

Merge Sort of 2 arrays into a third array in C

我正在编写一个函数,以便在 O(n) 中使用合并排序将 2 个数组排序为第 3 个数组,但我遇到了一些编译错误。任何帮助,甚至是可能的解决方案,我们将不胜感激!

Write a C function to merge 2 arrays, assumed to be ordered by ascending values, and store the result in a 3rd array, so it in turn is ordered.

#define LEN1    4
#define LEN2    5
    
int *merge(const int[], int, const int[], int); //allocates and returns an arrray
    
int main() {
    int a[LEN1] = { 1, 2, 3, 8 };
    int b[LEN2] = { -1, 2, 4, 7, 11 };
    int *m;   // to hold pointer to merged array, should free
    int *mp;  // point to successive result elements
    
    m = merge(a, LEN1, b, LEN2);
    mp = m;
    for (int i = 0; i < LEN1 + LEN2; i++)
        printf ("/%d", *mp++);
    free(m);
    printf("\n");
    return 0;
}

我的代码部分如下:

int c[LEN1+LEN2];
int *merge(const int a[], int alen, const int b[], int blen)
a=malloc(sizeof(int)*alen);
b=malloc(sizeof(int)*blen);
c=malloc(sizeof(int)*alen+blen);
{
    int i,j,k;
    i = j = k = 0;
    for(i=0;i < alen && j < blen;)
        {
            if(a[i] < b[j])
                {
                    c[k] = a[i];
                    k++;
                    i++;
                }
            else
                {
                    c[k] = b[j];
                    k++;
                    j++;
                }
        }
    while(i < alen)
    {
        c[k] = a[i];
        k++;
        i++;
    }
while(j < blen)
    {
        c[k] = b[j];
        k++;
        j++;
    }
}

对于代码没有被注释,我也很抱歉,我没有太多的 C 经验。

为什么要给 ab 分配内存?以及为什么它们不在函数的范围内。通过查看代码,我强烈建议您正确学习该语言的基本语法。 C 不应全局定义。
我在代码中更改了以下内容。
i) 删除了 ab.
的内存分配 ii) 在函数范围内初始化c.
iii) 从函数返回指针 c。 代码现在可以正常工作了。

int* merge (const int a[], int alen, const int b[], int blen)
{
   int *c = (int *)malloc(sizeof(int)*(alen+blen));
   int i,j,k;
   i = j = k = 0;
   for(i=0;i < alen && j < blen;)
   {
        if(a[i] < b[j])
        {
            c[k] = a[i];
            k++;
            i++;
        }
        else
        {
            c[k] = b[j];
            k++;
            j++;
        }
   }
   while(i < alen)
   {
        c[k] = a[i];
        k++;
        i++;
   }
   while(j < blen)
   {
        c[k] = b[j];
        k++;
        j++;
   }
   return c;
}

已发布,代码已损坏:

  • 额外的代码写在函数体之外,它被包含在原型之后的一个块中。这不会编译。

  • ab 是函数参数,不要为它们分配内存并覆盖它们的值。在函数原型中将它们声明为指向 int 的指针将是等效的,但由于数组被传递给 merge 函数,因此不会造成混淆:main() 传递数组 abmerge 但数组作为指针传递到 C 中的第一个元素,因此函数只接收指针。这个过程被描述为数组衰减为指针。函数参数恰好与 main 中的数组同名,这是另一个混​​淆源。

  • c 应在正文中声明为指向 int 的指针,并通过调用 malloc() 使用地址 return 进行初始化与组合数组的大小。 + 的优先级低于 * 因此 alen + blen 必须用括号括起来才能正确计算:

      int *c = malloc(sizeof(int) * (alen + blen));
    
  • merge函数必须return指向分配数组的指针return c;

  • 测试分配失败也是可取的。

还要改进您的演示文稿以提高可读性:

  • 正确缩进代码
  • 明智地使用空格:在二元运算符周围和 ,
  • 之后

这里是你的代码的一个稍微修改的版本:

#include <stdio.h>
#include <stdlib.h>   // for malloc and free

#define LEN1    4
#define LEN2    5
    
// allocates an array and returns a pointer to be freed
int *merge(const int[], int, const int[], int);
    
int main() {
    int a[LEN1] = { 1, 2, 3, 8 };
    int b[LEN2] = { -1, 2, 4, 7, 11 };
    int *m = merge(a, LEN1, b, LEN2);

    if (m) {
        for (int i = 0; i < LEN1 + LEN2; i++)
            printf ("/%d", m[i]);
        printf("\n");
        free(m);
    }
    return 0;
}

int *merge(const int *a, int alen, const int *b, int blen) {
    int i, j, k;
    int *c = malloc(sizeof(int) * (alen + blen));
    if (c == NULL)
        return NULL;

    i = j = k = 0;
    while (i < alen && j < blen) {
        if (a[i] <= b[j]) {
            c[k] = a[i];
            k++;
            i++;
        } else {
            c[k] = b[j];
            k++;
            j++;
        }
    }
    while (i < alen) {
        c[k] = a[i];
        k++;
        i++;
    }
    while (j < blen) {
        c[k] = b[j];
        k++;
        j++;
    }
    return c;
}