• 合并两个有序数组


    合并两个有序数组

    问题描述

    有两个排序的数组a和b,内存在a的末尾有足够多的剩余空间容纳b
    实现一个函数将b中所有的数字插入到a,最终结果是有序的

    实现思路

    由于a、b两个数组已经排序,并且题目提示在a数组的末尾有足够多空间容纳b数组,因此我们将b数组赋值给a数组时,可以考虑从两个数组的末尾元素开始比较,每次比较a数组和b数组的最后一个元素,将较大的那个元素作为新的a数组的最后一个元素,这样时间复杂度为O(n),而空间复杂度为O(1)

    代码

    显示数组的函数

    #include<iostream>
    #include<cstdio>
    using namespace std;
    
    //显示数组
    void DisplayArray( char *arrayName, int *a, int len )
    {
        if ( a== NULL || len <= 0)
        {
            cout<<"数组 "<<arrayName<<" 为空"<<endl;
            return;
        }
        cout<<"Element in array : "<<arrayName<<endl;
        for (int i = 0; i < len; i++)
        {
            cout<<a[i]<<" ";
        }
        cout<<endl;
    }
    

    合并两个数组的函数

    /*合并两个数组
    a:第一个数组,b:第二个数组
    totalalen, a数组中的总长度, alen:a数组实际长度,blen:b数组长度
    */
    void MergeArray(int *a, int *b,  int totalalen, int alen, int blen )
    {
        //参数检查
        if ( a== NULL || b== NULL  )
        {
            cout<<"输入数组为空,请检查"<<endl;
            return;
        }
    
        if ( alen <= 0 || blen <= 0 || totalalen < alen+blen)
        {
            cout<<"输入数组长度错误,请检查"<<endl;
            return;
        }
    
        int newidx = alen + blen - 1;//合并后数组的索引
        int aidx = alen -1;//a数组的索引
        int bidx = blen -1;//b数组的索引
    
        while (aidx >= 0 && bidx >= 0)
        {
            if (a[aidx] > b[bidx] )
                a[newidx--] = a[aidx--];
            else
                a[newidx--] = b[bidx--];
        }
    
        while ( bidx >= 0)
        {
            a[newidx--] = b[bidx--];
        }
    }
    

    测试代码

    各个测试用例调用该测试代码段

    
    //测试代码
    void Test(char *testName, int *arra1, int *arra2, int len, int len1, int len2 )
    {
        if (testName == NULL )
        {
            return;
        }
        cout<<testName<<" begins."<<endl;
        cout<<"Befor merge"<<endl;
        DisplayArray("A",arra1, len1);
        DisplayArray("B", arra2, len2);
    
        MergeArray(arra1, arra2, len, len1, len2);
        cout<<"After merge"<<endl;
        if ( len1 > 0)
        {
            DisplayArray("A", arra1, len1+len2);
        }
        else
            cout<<"A 为空"<<endl;
    }
    
    

    以下是各个测试用例,每个测试用例后是该用例的执行结果,测试用例可能不够完善

    1. 测试用例1

    //测试用例1,a、b数组一样长
    void Test1()
    {
        int a[10] = {1,3,5,7,9};
        int b[] = {2,4,6,8,10};
        
        Test("Test1", a, b, 10, 5, 5);
    }
    

    enter description here

    1. 测试用例2

    //测试用例2,a数组比b数组长
    void Test2()  
    {  
        int a[20]={1,2,3,7};  
        int b[]={4,5,6};  
    
        Test("Test2", a, b, 20, 4, 3);  
    }  
    

    enter description here

    1. 测试用例3

    //测试用例3,a数组比b数组短
    void Test3()  
    {  
        int a[20]={0};  
        int b[]={1,2,3};  
     
        Test("Test3", a, b, 20, 1, 3);  
    }  
    

    enter description here

    1. 测试用例4

    //测试用例4,a数组为空
    void Test4()  
    {  
        int a[20];  
        int b[]={0};  
    
        Test("Test4", a, b, 20, 0, 1);  
    }  
    

    enter description here

    1. 测试用例5

    //测试用例5,b数组为空
    void Test5()  
    {  
        int a[20]={0};  
        int b[3];  
    
        Test("Test5", a, b, 20, 1, 0);  
    }  
    

    enter description here

    1. 测试用例6

    //测试用例6,a、b数组相同
    void Test6()  
    {  
        int a[20]={1,3,5};  
        int b[3] = {1,3,5};
    
        Test("Test6", a, b, 20, 3, 3);  
    }
    
    

    enter description here

    main函数

    int main()
    {
        Test1();
        cout<<"===================="<<endl<<endl;
    
        Test2();
        cout<<"===================="<<endl<<endl;
    
        Test3();
        cout<<"===================="<<endl<<endl;
    
        Test4();
        cout<<"===================="<<endl<<endl;
    
        Test5();
        cout<<"===================="<<endl<<endl;
    
        Test6();
        cout<<"===================="<<endl<<endl;
        system("pause");
        return 0;
    }
    
  • 相关阅读:
    C#文件操作常用相关类(Directory类、File类、Path类)
    winform使用相对路径读取文件的方法
    设置GridView不换行强制GridView不换行GridView强制不换行
    VS2010 Visual Studio2010 保护视力 背景色设置颜色设置
    20190306
    20190325
    常用DOS命令
    项目创建
    VS2015自定义工具栏,往工具栏上添加按钮
    ping不通公网ip时路由器设置
  • 原文地址:https://www.cnblogs.com/scut-linmaojiang/p/4779204.html
Copyright © 2020-2023  润新知