我正在编写一个函数,以便使用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 方面没有太多经验。
正如发布的那样,代码已损坏:
额外的代码写在函数体之外,函数体包含在原型后面的块中。这不编译。
a
和b
是函数参数,不要为它们分配内存并覆盖它们的值。在函数原型中将它们声明为指向的指针int
将是等效的,但由于数组被传递给merge
函数,因此不会那么混乱:main()
传递数组a
和b
tomerge
但数组作为指向它们在 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] 删除。
我来说两句