【发布时间】:2014-12-30 21:51:07
【问题描述】:
语言是 ANSI C。我有 2 个 int 数组:A 和 B。 A 有一个名为 m 的索引,B 有一个名为 n 的索引。分配说m 必须不同于n,所以数组必须有不同的大小。我已经对此进行了编码。 A 按升序排列,B 按降序排列。我必须编写一个函数,在另一个名为C 的数组中进行两个数组的数学联合。如果一个元素在两个数组中,您只需将一个元素放在联合数组中(数组C)。
我的代码不能很好地工作。最后一个元素没有排序,我收到一个带有非常大的最后一个数字的输出,我不知道它来自哪里。
int index_c=index_m+index_n; //the index of array c
// is obtained by the sum of two indexes of the array A and B
int c[index_c];
int k=0;
for (i=0; i < index_m; i++)
{
for (j=0; j < index_n; j++)
{
if (a[i]==b[j])
{
c[k]=a[i]; //put only one time if is repeated more time in the two arrays
}
else
{
c[k]=a[i]; //put the a[i] element in the array c
c[k+1]=b[j]; //the element of the other array next to
}
}
k++;
}
printf("Elements in array C are: \n");
for (i=0; i<index_c; i++)
printf("element %d\n", c[i]);
数组C不排序也没关系,我会在union之后排序。有什么建议吗?
当我添加 1 个输入时,我正在尝试 put k++ 的建议,当我将两个输入添加到数组 C 时,我尝试使用 k+2。现在它工作得有点好,但它不能完全工作。我的意思是在输出中我没有大数值,但输出值之一(第三个)与第一个相同。 示例:3 9 3 2 5 第二个 3 是错误的,它缺少一个被第二个 3 覆盖的数字。 其他示例 2 4 2 1 9
【问题讨论】:
-
对
A = 1 3 5 8 13和B = 5 4 2 0的期望是什么? -
最好的代码应该对两个数组进行一次遍历。您知道两个数组都是有序的,尽管方向相反,因此您应该在简单的合并过程中从头到尾搜索一个,从头到尾搜索另一个。它还按排序顺序为您提供输出数据(如果您愿意,可以在升序和降序之间进行选择)。这为您提供 O(N) — 线性 — 时间,而不是您的骨架代码显示的二次 O(N*N) 时间。总是在可用时利用排序——它可以大大提高性能。
-
@Jongware:描述说 A 是按升序排列的,B 是按降序排列的。代码没有利用这一点。
-
@JonathanLeffler:是的,但从表面上看,代码没有利用 任何东西 :)(是的,我一定错过了)。
-
只给
c[0]到c[kindex_m]一个值。c的其余部分未初始化。
标签: c arrays algorithm sorting