将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 经验。
为什么要给 a
和 b
分配内存?以及为什么它们不在函数的范围内。通过查看代码,我强烈建议您正确学习该语言的基本语法。 C
不应全局定义。
我在代码中更改了以下内容。
i) 删除了 a
和 b
.
的内存分配
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;
}
已发布,代码已损坏:
额外的代码写在函数体之外,它被包含在原型之后的一个块中。这不会编译。
a
和 b
是函数参数,不要为它们分配内存并覆盖它们的值。在函数原型中将它们声明为指向 int
的指针将是等效的,但由于数组被传递给 merge
函数,因此不会造成混淆:main()
传递数组 a
和b
到 merge
但数组作为指针传递到 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;
}
我正在编写一个函数,以便在 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 经验。
为什么要给 a
和 b
分配内存?以及为什么它们不在函数的范围内。通过查看代码,我强烈建议您正确学习该语言的基本语法。 C
不应全局定义。
我在代码中更改了以下内容。
i) 删除了 a
和 b
.
的内存分配
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;
}
已发布,代码已损坏:
额外的代码写在函数体之外,它被包含在原型之后的一个块中。这不会编译。
a
和b
是函数参数,不要为它们分配内存并覆盖它们的值。在函数原型中将它们声明为指向int
的指针将是等效的,但由于数组被传递给merge
函数,因此不会造成混淆:main()
传递数组a
和b
到merge
但数组作为指针传递到 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;
}