c++实现合并排序的一个小问题


main()
{
    cout<<"请输入一组数:"<int a[4];
    for(int i=0;i<4;i++)
    cin>>a[i];
    MergeSort(a,0,3);
    for(int i=0;i<4;i++)
    cout<[i]<<" ";
}
void MergeSort(int a[],int left,int right)
{
    static int b[4]; 
    if(left//至少有两个个元素 
    {
        int i=(left+right)/2;//取中点 
        MergeSort(a,left,i);
        MergeSort(a,i+1,right);
        Merge(a,b,left,i,right);//合并到数组b 
        Copy(a,b,left,right);//复制回数组a 
    }
}
void Merge(int c[],int d[],int l,int m,int r)//合并c[l:m]和c[m+1:r]到d[l:r] 
{
    int i=l,j=m+1,k=l;
    while((i<=m)&&(j<=r))
    {
        if(c[i]<=c[j])
        {
            d[k++]=c[i++];
        }
        else
        {
            d[k++]=c[j++];
        }
        if(i>m)
        {
            for(int p=j;p<=r;p++)
            d[k++]=c[p];
        }
        else
        {
            for(int q=i;q<=r;q++)
            d[k++]=c[q];
        }
    }
}
void Copy(int a[],int b[],int left,int right)
{
    int i;
    static int j=0;
    for(i=left;i<=right;i++,j++)
    {
        a[j]=b[i];
    }
}

以上是我写的代码,copy函数不知道咋写,该咋写嘞

该回答引用ChatGPT
您好,您的Copy函数应该是将合并后的数组b复制回原数组a中。下面是一个简单的实现方式,可以参考一下:

void Copy(int a[], int b[], int left, int right) {
    for(int i = left; i <= right; i++) {
        a[i] = b[i];  // 将b数组的值复制回a数组中对应的位置
    }
}

这个函数的作用是将数组b中从位置left到right的值复制回数组a中对应的位置。在归并排序算法中,首先需要将数组复制到一个临时数组中进行合并排序。然后,经过排序后的结果需要在最后复制回原始数组中。此时,需要将数组b中的值复制回到数组a中相应的位置。

参考GPT和自己的思路:根据代码逻辑,copy函数的作用是将数组b中排序后的子数组复制回数组a中。根据代码,可以发现copy函数有两个参数:a和b数组以及排序子数组的左右边界。因此,可以按以下方式实现copy函数:

void Copy(int a[], int b[], int left, int right) {
    for (int i = left; i <= right; i++) {
        a[i] = b[i];
    }
}

该函数使用循环遍历排序后的子数组,将其逐个复制回原始数组a中。注意要使用<=而不是<来循环遍历子数组,因为排序后的子数组的右边界是包含在排序范围内的。

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/335455
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:c++(异常)
  • 除此之外, 这篇博客: c++程序设计读书笔记(梁勇版)中的 第十章 对象和类的更多内容 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    不可变类:所有数据域私有、没有更改器函数、没有访问器函数访返回指向可变对象数据域的引用或指针。
    避免重复声明:为了防止头文件被加载两次,需要在头文件中加入如下部分。
    #ifndef DATE_H
    # define DATE_H
    程序
    # endif
    静态变量(类变量):一个类的所有实例共享数据,当其中的一个被修改时,全部实例中的变量都要被修改。c++也支持静态函数,因为上述原因,静态函数被调用时无需创造实例。创建方法:用static来声明。静态函数和静态数据域既可以通过类名来访问,也可以通过对象来访问。一般通过类名来访问,增加可读性,为静态函数 (类名:: 函数名)。当变量不依赖于具体对象的实现时,就应当标为静态变量。
    析构函数:它是无参的,相对于构造函数,析构函数用来销毁变量,命名规则也近似于构造函数,在构造函数前加 ~ 。
    拷贝构造函数:默认的构造函数将创建一个新建对象,并将另一个对象的数据初始化给新建对象。构造函数声明如 类名 (类名&)。若将 circle1拷贝到circle2 ,则 Circle circle2(circle1)
    自定义拷贝构造函数:先声明后实现
    友元函数和友元类:允许可信的函数或类来访问私有成员,关键字 friend,(在自身类定义时添加到public中 friend class 友元名。
    对象合成:一个对象包含另一个对象,如一个类中数据域为另一个类的对象时。这两个类之间的关系就是合成。合成是聚合的特殊情况,所有者对象被称为聚合对象,主体对象称为被聚合对象。当一个对象仅被一个对象所有时,称为合成。用于建模 has-a 关系。
    c++向量类:vector < datatype > vectorname 其大小自动扩展,通过数组下标运算符[ ]来访问。 需要 包含头文件 # include < vector>.


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^