Amagi. 2023-03-16 17:20 采纳率: 0%
浏览 20
已结题

关于#算法#的问题:这个算法我是根据教学PPT上的伪代码翻译的,检查了一下午也没找到问题在哪(语言-c++)

这个算法我是根据教学PPT上的伪代码翻译的,检查了一下午也没找到问题在哪,求指点。(附上伪代码

img

img


#include<bits/stdc++.h>
using namespace std;


void Merge(int A[],int p,int q,int r){
    int x=q-p+1,y=r-q;
    int B[x],C[y];
    int k=0;
    for(int i=p;i<=q;i++){
        B[k++]=A[i];
    }
    k=0;
    for(int i=q+1;i<=r;i++){
        C[k++]=A[i];
    }    
    int i,j=0;
    k=p;
    while(i<x && j<y){
        if(B[i]<=C[j]){
            A[k]=B[i];
            i++;        
        }
        else {
            A[k]=C[j];
            j++;
        }
        k++;
        
    }
    if(i>=x){
        for(int m=j;m<y;m++){
            A[k]=C[m];
            k++;
        }
    } 
    else{
        for(int n=i;n<x;n++){
            A[k]=B[n];
            k++;
        }
    }
}

void MergeSort(int A[],int p,int r){
    if(p<r){
        int q=(p+r)/2;
        MergeSort(A,p,q);
        MergeSort(A,q+1,r);
        Merge(A,p,q,r);
    }
}
int main(){
    int s;
    cin>>s;
    int S[s];
    for(int i=0;i<s;i++){
        cin>>S[i];
    }
    MergeSort(S,0,s-1);
    for(int i=0;i<s;i++){
        cout<<S[i]<<" "; 
    }
    return 0;
} 

  • 写回答

2条回答 默认 最新

  • threenewbee 2023-03-16 17:24
    关注
    
    #include<iostream>
    using namespace std;
    //合并排序
    int Mergesort(int a[],int left,int right);
    void Merge(int a[],int left,int mid,int right);
      
    int main()
    {
        int n;
        cin>>n;
        int *a=new int[n];
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
    
        Mergesort(a,0,n-1);
    
        for(int i=0;i<n;i++)
        {
            cout<<a[i]<<" ";
        }
        delete [] a;
        return 0;
    }
    
    int Mergesort(int *a,int left,int right)
    {
        if(left<right)
        {
            int mid=(left+right)/2;
            Mergesort(a,left,mid);
            Mergesort(a,mid+1,right);
            Merge(a,left,mid,right);
        }
        else{return 0;}
    }
    
    void Merge(int *a,int left,int mid,int right)
    {
        int *b=new int[right-left+1];
        int i=left,j=mid+1;
        int k=0;
        while(i<=mid&&j<=right)
        {
            if(a[i]>a[j])
            {
                b[k]=a[j];
                k++;
                j++;
            }
            else
            {
                b[k]=a[i];
                k++;
                i++;
            }
    
        }
        while(i<=mid)
        {
            b[k++]=a[i++];
        }
        while(j<=right)
        {
            b[k++]=a[j++];
        }
        int site=0; 
        for(int m=left;m<=right;m++)
        {
            a[m]=b[site++];
        }
        delete [] b;
    }
    
    

    具体看 https://blog.csdn.net/YTLDSS/article/details/123962059

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月16日
  • 创建了问题 3月16日

悬赏问题

  • ¥15 android 集成sentry上报时报错。
  • ¥50 win10链接MySQL
  • ¥35 跳过我的世界插件ip验证
  • ¥15 抖音看过的视频,缓存在哪个文件
  • ¥15 自定义损失函数报输入参数的数目不足
  • ¥15 如果我想学习C大家有是的的资料吗
  • ¥15 根据文件名称对文件进行排序
  • ¥15 deploylinux的ubuntu系统无法成功安装使用MySQL❓
  • ¥15 有人会用py或者r画这种图吗
  • ¥15 MOD04_3K图像预处理