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

欧米茄

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

编写一个 C 函数来合并 2 个数组,假设按升序排列,并将结果存储在第三个数组中,因此依次排序。

#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是函数参数,不要为它们分配内存并覆盖它们的值。在函数原型中将它们声明为指向的指针int将是等效的,但由于数组被传递给merge函数,因此不会那么混乱main()传递数组abtomerge但数组作为指向它们在 C 中的第一个元素的指针传递,因此函数只接收指针. 这个过程被描述为数组衰减为指针函数参数恰好与 中的数组同名,这是main另一个混淆的来源。

  • c应该在主体内部声明为指向int并使用malloc()组合数组大小调用返回的地址进行初始化+优先级低于*soalen + blen必须用括号括起来才能正确计算:

      int *c = malloc(sizeof(int) * (alen + blen));
    
  • merge函数必须返回指向已分配数组的指针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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Ruby:将两个数组的各个值配对为第三个数组

将2个AJAX调用中的数据合并到一个数组中?

我在C中的(char *)元素数组上有三个循环。为什么第三个失败?

使用Oracle MERGE INTO将两个表中的数据合并到第三个表中

numpy:将第三个维度上的两个数组连接起来

如何将数组设置为等于二维数组中存储在第三个数组中的列中的值?

将值从两个数组转换为新的第三个数组

使用2个数组在numpy中填充第三个数组

PHP将2个数组合并为第三个数组

C ++如何将Vector的两个对象合并,合并,相交到新的第三个对象中?

javaScript将两个数字相乘并将结果显示到第三个html输入中

从两个数组中获取正数,然后从中创建第三个

使用CROSS JOIN将两个表合并到现有的第三个表中-

在Python中包含2个数组的轮廓图和第三个包含卡方的轮廓图

匹配内容后将 2 个数组合并到新数组中 javascript

C3.js 散点图 - 如何将第三个数据(附加值)关联为原始列数据的一部分,以便回调设置半径并在工具提示中显示

在 2 个数据帧之间的 Pandas 中查找以创建第三个数据帧

如何在不覆盖的情况下将 2 个表合并到第三个表 SQL 中?

Java:使用第一个数组的前 3 个整数,然后使用第二个数组中的 3 个整数将 2 个数组组合成第三个数组

将两个数组 php 与第三个数组进行比较

将两个不同数组的元素合并到第三个数组

似乎无法像我希望的那样将 2 个数组合并到一个 csv 文件中

我想减去 2 个数组并得到第三个数组,它由第一个数组的剩余元素组成

如何将 2 个字典合并到一个数组中?

将数据从 2 个数组合并到一个新数组作为对象——Javascript

Pandas 将多个目录中的 Excel 文件合并到第三个目录中

如何将char数组的特定索引传递给outtextxy()函数在c中的第三个参数

比较2个数组并在python中写入第三个的最有效方法

将两个指针数组合并到 C++ 中的第三个指针数组中