两个有序数组进行整合,要求整合后数组保持有序

Posted komean

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了两个有序数组进行整合,要求整合后数组保持有序相关的知识,希望对你有一定的参考价值。

题设:有两个有序数组A1和A2,内存在A1的末尾有足够的空间容纳A2,请实现一个函数,把A2中的所有的数字插入到A1中,并且保持所有的数字是有序的。

1.解题思路:

1、计算两个数组有效值合并后有效长度。
2、设置三个指针,(p,q,k),一个指向A1已初始化末尾,A2以初始化末尾, A1 + len(A2)末尾
技术图片
3、比较p和q所指向的元素的大小,并将较大值赋值给k指针所指向的内容。
技术图片
4、考虑当某个数组指向首地址时,另一个数组仍然存在多个数组没有进行比较的情况。
技术图片

2.源码

#include <iostream>
using namespace std;

void test()
{
    int A1[20] = {1,3,5,6,7,8,12,17,19,20};
    int A2[5] = {-1,-3,5,6,19};

    /*
        E1. 获取A2的长度
        E2. 定义三个指针(p,q,k),一个指向A1已初始化末尾,A2以初始化末尾, A1 + len(A2)末尾
    */

    int *p = A1 + 9; // p 指向A1有效初始化的最后一个元素
    int *q = A2 + 4; // q 指向A2有效初始化的最后一个元素
    int *k = A1 + 14; // k 指向两个数组合并后,A1有效值的最后一个元素

    // 当A1指针p 或A2指针q指向首地址时之前(包含首地址元素的比较),进行较最大元素赋值
    while(p >= A1 && q >= A2){
        if(*p >= *q){
            *k-- = *p;
            // 避免指针溢出
            if(p != A1){                
                p--;
            }else
            {
                break;
            }
        }else{
            *k-- = *q;
            // 避免指针溢出            
            if(q != A2){                
                q--;
            }else
            {
                break;
            }
            
        }
    }


    // 剩余元素进行替换(考虑当某个数组指向首地址时,另一个数组仍然存在多个数组没有进行比较的情况。
)
    while(q >= A2){
        *k-- = *q;            
        if(q != A2){
            q--;
        }else
        {
            break;
        }    
    }

    // 打印数组A1
    for(auto i : A1){
        cout << i << ' ';
    }
    cout << endl;
    
}

int main()
{
    test();
    return 0;
}

技术图片

以上是关于两个有序数组进行整合,要求整合后数组保持有序的主要内容,如果未能解决你的问题,请参考以下文章

合并两个有序数组

leetcode题 寻找两个有序数组的中位数

将一个任意整数插入到已排列的整型数组中,插入后,数组中的数仍保持有序

算法系列-------直接插入排序(InsertionSort)

Leetcode 寻找两个有序数组的中位数

java刷题--88合并两个有序数组