2302_79644694 2024-03-02 20:32 采纳率: 42.9%
浏览 6
已结题

c语言归并排序找错误


//归并排序
#include <stdio.h>
int b[10];


void merge(int *a,int low,int mid,int high)
{
    int i,j,k;


    for(k=low;k<=high;k++)
        b[k++]=a[k++];

    i=low;
    j=mid+1;
    k=low;

    while(i<=mid&&j<=high)
    {
        if(b[i]<=b[j]) a[k++]=b[i++];
        else a[k++]=b[j++];
    }



    while(i<=mid)
    {
        a[k++]=b[i++];
    }
    while(j<=high)
    {
        a[k++]=b[j++];
    }

   // return b;
}

 void mergesort(int *a,int low,int high)
 {
       if(low<high)
       {
           int mid=(low+high)/2;

           mergesort(a,low,mid);
           mergesort(a,mid+1,high);
           merge(a,low,mid,high);

       }
 }



 int main()
 {
    int a[10]={7,4,1,8,5,2,9,6,3,10};
    //int *b=NULL;
    mergesort(a,0,9);



    for(int i=0;i<10;i++)
        printf("%d ",a[i]);
 }
  • 写回答

5条回答 默认 最新

  • 关注

    2302_79644694 晚上好🌙🌙🌙
    本答案参考ChatGPT-3.5

    错误:

    1. 在merge函数的for循环中,k的自增应该是k++而不是k+=2。因为已经在循环中自增了一次,所以不需要再自增一次。
    2. 在merge函数的for循环中,b数组的赋值应该是b[k]=a[k]而不是b[k++]=a[k++]。因为k已经在循环中自增了一次,所以不需要再自增一次。
    3. merge函数中的while循环条件应该是i<=mid&&j<=high而不是i<=mid||j<=high。因为归并排序是要同时比较两个子数组的元素进行排序。
    4. mergesort函数的将数组划分为两个子数组的中点计算应该是mid=(low+high)/2而不是mid=(low+high)/2+1。因为需要保证左右两个子数组的长度一致。
    5. 在主函数main中,调用mergesort函数传入的数组长度应该是9而不是10。因为数组下标是从0开始的。

    修改后的代码如下:

    //归并排序
    #include <stdio.h>
    int b[10];
    
    void merge(int *a,int low,int mid,int high) {
        int i,j,k;
    
        for(k=low;k<=high;k++)
            b[k]=a[k];
    
        i=low;
        j=mid+1;
        k=low;
    
        while(i<=mid&&j<=high)
        {
            if(b[i]<=b[j]) 
                a[k++]=b[i++];
            else 
                a[k++]=b[j++];
        }
    
        while(i<=mid)
        {
            a[k++]=b[i++];
        }
        while(j<=high)
        {
            a[k++]=b[j++];
        }
    }
    
    void mergesort(int *a,int low,int high) {
        if(low<high)
        {
            int mid=(low+high)/2;
            mergesort(a,low,mid);
            mergesort(a,mid+1,high);
            merge(a,low,mid,high);
        }
    }
    
    int main() {
        int a[10]={7,4,1,8,5,2,9,6,3,10};
        mergesort(a,0,9);
    
        for(int i=0;i<10;i++)
            printf("%d ",a[i]);
    }
    
    评论

报告相同问题?

问题事件

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

悬赏问题

  • ¥15 请各位帮我看看是哪里出了问题
  • ¥15 vs2019的js智能提示
  • ¥15 关于#开发语言#的问题:FDTD建模问题图中代码没有报错,但是模型却变透明了
  • ¥15 uniapp的h5项目写一个抽奖动画
  • ¥15 hadoop中启动hive报错如下怎么解决
  • ¥15 如何优化QWebEngineView 加载url的速度
  • ¥15 关于#hadoop#的问题,请各位专家解答!
  • ¥15 如何批量抓取网站信息
  • ¥15 Spring Boot离线人脸识别
  • ¥15 使用Ant Design Pro vue的时候,使用环境变量的时候,构建报错是什么原因