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

题设:有两个有序数组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;
}

posted on 2019-03-29 17:03  小明他很忙  阅读(888)  评论(0编辑  收藏  举报

导航