将两个排好序的数组,合并到另外一个数组中,并且合并之后的数组也是有序的。

本文介绍了一个简单的程序,该程序首先生成两个包含随机整数的数组,并对其进行排序。然后,程序将这两个已排序的数组合并成一个新的有序数组。通过此过程,展示了基本的数组操作、随机数生成、冒泡排序及合并排序的概念。

   int a[10] = {0};

    int b[10] = {0};

    int c[20] = {0};

    //给数组a赋值

    for (int i = 0; i < 10; i++) {

        a[i] = arc4random() % (40 - 20 + 1) + 20;

    }

    //给数组b赋值

    for (int i = 0; i < 10; i++) {

        b[i] = arc4random() % (40 - 20 + 1) + 20;

    }

    //将数组a排序

    for (int i = 0; i < 10 - 1; i++) {

        for (int j = 0; j < 10 - 1 - i; j++) {

            if (a[j] > a[j + 1]) {

                int temp = a[j];

                a[j] = a[j + 1];

                a[j + 1] = temp;

            }

        }

    }

    //将数组b排序

    for (int i = 0; i < 10 - 1; i++) {

        for (int j = 0; j < 10 - 1 - i; j++) {

            if (b[j] > b[j + 1]) {

                int temp = b[j];

                b[j] = b[j + 1];

                b[j + 1] = temp;

            }

        }

    }

    //输出数组a

    for (int i = 0; i < 10; i++) {

        printf("%d ", a[i]);

    }

    printf("\n");

    //输出数组b

    for (int j = 0; j < 10; j++) {

        printf("%d ", b[j]);

    }

    printf("\n");

    //将数组a和数组b合并到数组c中

    int i = 0, j = 0, k = 0;

    while (i < 10 && j < 10 ) {

        if (a[i] > b[j]) {

            c[k++] = b[j++];

        } else {

            c[k++] = a[i++];

        }

    }

    while (i < 10) {

        c[k++] = a[i++];

    }

    while (j < 10) {

        c[k++] = b[j++];

    }

    //输出排序好的数组c

    for (int m = 0; m < 20; m++) {

        printf("%d ", c[m]);

    }

在C语言中,合并两个排好数组有两种常见方法。 ### 方法一:先合并再排 先将两个数组合并一个数组,不管其是否有序,然后对合并后的数组进行排。以下是示例代码: ```c void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) { int i; int j = 0; for (i = m; i < m + n; i++) { nums1[i] = nums2[j]; j++; } for (i = 0; i < m + n - 1; i++) { for (j = 0; j < m + n - 1 - i; j++) { if (nums1[j] > nums1[j + 1]) { int tmp = nums1[j]; nums1[j] = nums1[j + 1]; nums1[j + 1] = tmp; } } } } ``` 这种方法的思路比较直接,但没有利用数组原本有序的条件,时间复杂度较高,为$O((m + n)^2)$ [^1][^2][^4]。 ### 方法二:在合并过程中排 借鉴归并排的归并过程,在合并数组的过程中对元素进行排合并结束时排也完成。该方法直接在`num1`原数组上修改,同时从后往前遍历两个数组,选较大者插入`num1`的末尾,依次往前插入。以下是示例代码: ```c void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n) { int i = m - 1; int j = n - 1; int k = m + n - 1; // 同时遍历两个数组 while (i >= 0 && j >= 0) { // 择大者插入num1末尾,依次从后往前插入 if (nums1[i] > nums2[j]) { nums1[k--] = nums1[i--]; } else { nums1[k--] = nums2[j--]; } } // 考虑到num2没有完全遍历的情况 while (j >= 0) { // 依次从后往前插入 nums1[k--] = nums2[j--]; } } ``` 这种方法利用了数组有序的条件,时间复杂度为$O(m + n)$ [^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值