梦想是代码一写就对 2023-04-02 18:55 采纳率: 65%
浏览 16
已结题

关于c++合并排序代码调试



#include<iostream>
using namespace std;
void MergeSort(int a[],int left,int right);
void Merge(int c[],int d[],int l,int m,int r);
void Copy(int a[],int b[],int left,int right);
main()
{
    cout<<"请输入一组数:"<<endl;
    int a[4],b[4];
    for(int i=0;i<4;i++)
    cin>>a[i];
    MergeSort(a,0,3);
    for(int i=0;i<4;i++)
    cout<<a[i]<<" ";
}
void MergeSort(int a[],int left,int right)
{
    if(left<right)//至少有两个个元素 
    {
        int i=(left+right)/2;//取中点 
        MergeSort(a,left,i);
        MergeSort(a,i+1,right);
        int b[4];
        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<=m;q++)
            d[k++]=c[q];
        }
    }
}
void Copy(int a[],int b[],int left,int right)
{
    for(int i=left;i<=right;i++)
    {
        a[i]=b[i];
        //cout<<b[i]<<endl;
    }
}#include<iostream>
using namespace std;
void MergeSort(int a[],int left,int right);
void Merge(int c[],int d[],int l,int m,int r);
void Copy(int a[],int b[],int left,int right);
main()
{
    cout<<"请输入一组数:"<<endl;
    int a[4],b[4];
    for(int i=0;i<4;i++)
    cin>>a[i];
    MergeSort(a,0,3);
    for(int i=0;i<4;i++)
    cout<<a[i]<<" ";
}
void MergeSort(int a[],int left,int right)
{
    if(left<right)//至少有两个个元素 
    {
        int i=(left+right)/2;//取中点 
        MergeSort(a,left,i);
        MergeSort(a,i+1,right);
        int b[4];
        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<=m;q++)
            d[k++]=c[q];
        }
    }
}
void Copy(int a[],int b[],int left,int right)
{
    for(int i=left;i<=right;i++)
    {
        a[i]=b[i];
        //cout<<b[i]<<endl;
    }
}

输入1 3 2 4得1 2 2 4,不知道哪里有问题,猜测是b[]数组定义有问题?

  • 写回答

3条回答 默认 最新

  • Leodong. 2023-04-02 19:11
    关注

    该回答通过自己思路及引用到各个渠道搜索综合及思考,得到内容具体如下:
    在Merge函数中,将两个有序数组合并到一个新数组d[]中,但是在合并过程中,两个for循环的条件判断有误。应该将第一个for循环的条件判断改成 j>r,将第二个for循环的条件判断改成 i>m。修改后的代码如下:

    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(j>r)
        {
            for(int p=i;p<=m;p++)
            d[k++]=c[p];
        }
        else
        {
            for(int q=j;q<=r;q++)
            d[k++]=c[q];
        }
    }
    另外,定义数组b[]的大小应该与数组a[]的大小一致,因此应该将 int b[4] 改为 int b[right-left+1],即:
    
    void MergeSort(int a[],int left,int right)
    {
        if(left<right)//至少有两个个元素 
        {
            int i=(left+right)/2;//取中点 
            MergeSort(a,left,i);
            MergeSort(a,i+1,right);
            int b[right-left+1];
            Merge(a,b,left,i,right);//合并到数组b 
            Copy(a,b,left,right);//复制回数组a 
        }
    }
    修改后的代码如下:
    
    #include<iostream>
    using namespace std;
    
    void MergeSort(int a[],int left,int right);
    void Merge(int c[],int d[],int l,int m,int r);
    void Copy(int a[],int b[],int left,int right);
    
    int main()
    {
        cout<<"请输入一组数:"<<endl;
        int a[4],b[4];
        for(int i=0;i<4;i++)
            cin>>a[i];
        MergeSort(a,0,3);
        for(int i=0;i<4;i++)
            cout<<a[i]<<" ";
        return 0;
    }
    
    void MergeSort(int a[],int left,int right)
    {
        if(left<right)//至少有两个个元素 
        {
            int i=(left+right)/2;//取中点 
            MergeSort(a,left,i);
            MergeSort(a,i+1,right);
            int b[right-left+1];
            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(j>r)
        {
            for(int p=i;p<=m;p++)
                d[k++]=c[p];
        }
        else
        {
            for(int q=j;q<=r;q++)
                d[k++]=c[q];
        }
    }
    
    void Copy(int a[],int b[],int left,int right)
    {
        for(int i=left;i<=right;i++)
        {
            a[i]=b[i];
        }
    }
    

    修改后的代码可以正确地对数组进行合并排序。


    如果以上回答对您有所帮助,点击一下采纳该答案~谢谢

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 4月11日
  • 已采纳回答 4月3日
  • 创建了问题 4月2日

悬赏问题

  • ¥15 求帮我调试一下freefem代码
  • ¥15 matlab代码解决,怎么运行
  • ¥15 R语言Rstudio突然无法启动
  • ¥15 关于#matlab#的问题:提取2个图像的变量作为另外一个图像像元的移动量,计算新的位置创建新的图像并提取第二个图像的变量到新的图像
  • ¥15 改算法,照着压缩包里边,参考其他代码封装的格式 写到main函数里
  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?