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

本文介绍两种数组合并排序的方法:一种是简单直接的合并再排序;另一种是通过比较逐个存储的方式进行排序,此方法更高效并能锻炼逻辑思维。

    //第一种方法:现将两个数组合并到第三个数组中,再对第三个数组排序(偷懒的方法)

    /*

    int a[] = {2, 20, 8, 30}, b[] = {5, 9, 13, 29}, c[8] = {0};

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

        c[i] = a[i];

    }

    for (int i = 4, j = 0; i < 8; i++, j++) {

        c[i] = b[j];

    }

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

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

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

                int temp = c[j];

                c[j] = c[j + 1];

                c[j + 1] = temp;

            }

        }

    }

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

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

    }

     */

    //标准方法第二种方法:边比较边存储(这才锻炼逻辑)

    int a[4] = {2, 5, 8, 30}, b[4] = {5, 9, 13, 29}, c[8] = {0}, m = 0, n = 0, i = 0;//c[]存储a[]b[]比较后的元素,m指向a[]的元素下标,n指向b[]的元素下标,i指向c[]的元素下标

    while (m != 4 && n != 4) {//a[]b[]都没有排完

        if (a[m] < b[n]) {

            c[i] = a[m];//把小数赋给c[i];

            m++;//a[]的下标增1;

            i++;//c[]的下标增1;

        } else if (a[m] > b[n]) {

            c[i] = b[n];//把小数赋给c[i];

            n++;//b[]的下标增1;

            i++;//c[]的下标增1;

        } else {//若相等

            c[i] = a[m];//先把a[m]赋给c[i]

            c[++i] = b[n];//先讲i1,再将b[n]赋给c[i]

            m++;//a[]的下标增1;

            n++;//b[]的下标增1;

            i++;//c[]的下标增1;

        }

    }

    if (m == 4) {//a[]先排完

        for (int j = n; j < 4; j++) {

            c[4 + n] = b[j];//b[]之后的元素逐个赋给c[]

        }

    }

    if (n == 4) {//b[]先排完

        for (int j = m; j < 4; j++) {

            c[4 + m] = a[j];//a[]之后的元素逐个赋给c[]

        }

    }

    printf("合并后的序列为:\n");

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

        printf("%d ", c[j]);//打印c[]

    }

    printf("\n");

在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、付费专栏及课程。

余额充值