语言是ANSI C.我有2个int
数组:A
和B
。 A
有一个名为m
的索引,B
有一个名为n
的索引。赋值说m
必须与n
不同,因此数组必须具有不同的大小。我已经编码了这个。 A
按升序排序,而B
按降序排列。我必须编写一个函数,在另一个数组C
中进行两个数组的数学联合。如果一个元素在两个数组中,则必须只在union的数组中放置一个元素(数组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没有排序也没关系,我会在联合之后排序。有什么建议吗?
当我添加1个输入时,我正在尝试放置k ++的建议,而当我向数组C添加两个输入时,我尝试k + 2.现在它工作得很好,但它没有完全正常工作。我的意思是在输出中我没有大数值,但其中一个输出值(第3个)与第一个相同。 示例:3 9 3 2 5第二个3错了,它缺少第二个3覆盖的数字。 其他例子2 4 2 1 9
答案 0 :(得分:2)
我发现两个直接的逻辑错误,至少应该修复:
您可以在c
中存储一个号码,当两个输入相同时,将k
增加1,或存储两个< / em>数字到c
。然后你应该用2增加k
。在您现在拥有的代码中,您只需添加另一个+1
- 但为了清楚起见,请考虑将这些添加内容放在if..else
测试块中。目前,您正在覆盖存储的最后一个。
将结果从0打印到index_c
,即两个输入数组的长度之和。这是不合逻辑的,因为你扔掉了数字。因此,你得到随机的&#39;数字作为输出;那些只是未初始化,即从未写入。从0到k
打印,因为 是您输入的有效范围。
答案 1 :(得分:2)
到目前为止,没有一个答案利用了数组都被排序的事实。这是一个与注释中建议的 merge 几乎完全相同的实现。合并的复杂性是O(m + n)。
我假设每个数组都没有重复项(没有[0,1,1,3]),但如果我认为错了,你可以添加if (k == 0 || k > 0 && C[k - 1] != A[i])
之类的检查来解决这个问题。
该函数返回C
的长度。C
按递增顺序排序。要将C
按降序排序,而是将if (A[i] < B[j])
更改为if (A[i] > B[j])
。
int union_merge(const int *A, int m, const int *B, int n, int *C) {
int i = 0, j = n - 1, k = 0;
while (i < m && j >= 0) {
if (A[i] < B[j]) {
C[k++] = A[i++];
} else if (A[i] == B[j]) {
C[k++] = A[i++];
--j;
} else {
C[k++] = B[j--];
}
}
while (j >= 0) {
C[k++] = B[j--];
}
while (i < m) {
C[k++] = A[i++];
}
return k;
}
答案 2 :(得分:1)
假设您有两个数组A和B,以及联合数组C.您可以将数组A和B都输入到一个数组中。然后你可以对该数组进行排序,并在对数组进行迭代迭代后,如果你还没有添加该值,则将值添加到数组C(联合数组)。总复杂度为O(N * log(N))查看代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 100000
int a[2*MAX+3], c[2*MAX+3];
int cmp(const void *a, const void *b) {
if ( *(int*)a < *(int*)b ) return -1;
if ( *(int*)a == *(int*)b ) return 0;
if ( *(int*)a > *(int*)b ) return 1;
}
int main() {
int i, k;
int n, m; scanf("%d%d", &n, &m); // size of the first array and size of the second array
n += m;
for(i = 0; i < n; ++i) // O(N) , input both arrays into one array
scanf("%d", &a[i]);
qsort(a, n, sizeof(int), cmp); // O( N * log(N) ), sort the given array
c[0] = a[0];
for(i = 1, k = 1; i < n; ++i) // O(N)
if(c[k - 1] != a[i]) // if the last element that you added to the union array is different than the current element in first array then add that element to union array
c[k++] = a[i];
for(i = 0; i < k; ++i) // O(K)
printf("%d ", c[i]);
return 0;
}