zoukankan      html  css  js  c++  java
  • 两个有序数组进行整合,要求整合后数组保持有序

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

  • 相关阅读:
    【SQL】语句综合练习
    【Java基础】static关键字
    【SQL】定义约束
    【SQL】数据定义语言(DDL)
    【SQL】事务处理语言(TCL)
    Stream流
    线程池(重点)
    CountDownLatch CyclicBarrier Semaphore
    集合线程安全
    20210128 寻找数组的中心索引
  • 原文地址:https://www.cnblogs.com/komean/p/10622496.html
Copyright © 2011-2022 走看看