【问题标题】:Combining two given sequences into a new increasing sequence将两个给定序列组合成一个新的递增序列
【发布时间】:2021-01-12 15:56:44
【问题描述】:

我正在做以下问题:

给定由n 整数组成的序列a 和由m 整数组成的序列b,两个序列按升序排列。将上述两个序列组合成一个新序列c,这样c 也是一个递增序列。打印c。

输入:

3
1 3 4
4     
1 2 3 5

输出:

1 1 2 3 3 4 5

我的想法是首先将两个序列组合成序列c,然后按升序对序列c 进行排序。这是我的代码:

#include <stdio.h>

int main() {
    //Inputting sequence a and b
    int n, m;
    int a[1001], b[1001];

    scanf("%d", &n);
    for (int i = 0; i < n; i++) {
        scanf("%d", &a[i]);
    }

    scanf("%d", &m);
    for (int i = 0; i < m; i++) {
        scanf("%d", &b[i]);
    }

    //Combine two sequence into c
    int c[1001];
    for (int i = 0; i < n; i++) {
        c[i] = a[i];
    }
    for (int i = 0; i < m; i++) {
        c[i + n] = b[i];
    }

    //Arrange sequence c in increasing order
    int mid;
    for (int i = 0; i < (n + m - 1); i++) {
        for (int j = 1; j < (n + m); j++) {
            if (c[i] > c[j]) {
                mid = c[i];
                c[i] = c[j];
                c[j] = mid;
            }
        }
    }

    //Printing c
    for (int i = 0; i < (n + m); i++) {
        printf("%d ", c[i]);
    }
    
    return 0;
}

但是,当我使用测试用例[1,2,4],[1,2,5] 进行测试时,结果是1 4 2 2 1 5。谁能指出我的代码中的错误?我真的很感激。

【问题讨论】:

  • 如果您知道序列 a 和 b 已经排序,为什么不在将条目添加到 c 时使用这个事实?
  • 指令要求您合并两个排序的序列。本网站搜索框中的最后四个单词可能会准确地告诉您如何执行此操作,并且比您当前使用的 O(N^2) 算法更有效。两个初始序列都已经排序是一个非常重要的属性。
  • 考虑添加一些输入验证,因为您为 a 和 b 两个集合分配了预定义的内存量,并且通过输入获得的值可能更大。此外,数组c 的声明大小至少应等于数组a 和b 组合的大小。

标签: arrays c sorting


【解决方案1】:

不考虑i的值,在1到n+m-1范围内搜索最小值是错误的。这可能会将最小值移动到数组的后半部分。

线

        for (int j = 1; j < (n+m); j++)

应该是

        for (int j = i + 1; j < (n+m); j++)

【讨论】:

    【解决方案2】:

    要合并 2 个已排序的数组,您可以像合并排序的经典实现一样编写 3 个循环:

    #include <stdio.h>
    
    int main() {
        //Inputting sequence a and b
        int a[1000], b[1000], c[2000];
        int n, m, i, j, k;
    
        if (scanf("%d", &n) != 1 || n <= 0 || n > 1000)
            return 1;
        for (i = 0; i < n; i++) {
            if (scanf("%d", &a[i]) != 1)
                return 1;
        }
    
        if (scanf("%d", &m) != 1 || m <= 0 || m > 1000)
            return 1;
        for (i = 0; i < m; i++) {
            if (scanf("%d", &b[i]) != 1)
                return 1;
        }
    
        //Combine both sequences into c
    
        i = 0, j = 0, k = 0;
        while (i < n && j < m) {
            if (a[i] <= b[j])
                c[k++] = a[i++];
            else
                c[k++] = b[j++];
        }
        while (i < n) {
            c[k++] = a[i++];
        }
        while (j < m) {
            c[k++] = a[j++];
        }
    
        //Printing c
        for (i = 0; i < n + m; i++) {
            printf("%d ", c[i]);
        }
        printf("\n");
        
        return 0;
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多