在C中的函数,实现了另一个int中两个int数组的数学联合

时间:2014-12-30 21:51:08

标签: c arrays algorithm sorting

语言是ANSI C.我有2个int数组:ABA有一个名为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

3 个答案:

答案 0 :(得分:2)

我发现两个直接的逻辑错误,至少应该修复:

  1. 您可以在c中存储一个号码,当两个输入相同时,将k增加1,存储两个< / em>数字到c。然后你应该用2增加k。在您现在拥有的代码中,您只需添加另一个+1 - 但为了清楚起见,请考虑将这些添加内容放在if..else测试块中。目前,您正在覆盖存储的最后一个。

  2. 将结果从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;
}