【问题标题】:Merge sort not showing correct output合并排序未显示正确的输出
【发布时间】:2014-10-11 05:57:19
【问题描述】:

我已经实现了每一行合并排序算法,但找不到错误。 al 和 ar 是左右子数组。数组与大小一起传递。

#include<stdio.h>
#include<conio.h>
void mergesort(int a[] ,int);
void merge(int al[],int,int ar[],int,int a[]);
int main()
{
    int i,n;
    printf("Enter the no of elements to be sorted\n");
    scanf("%d",&n);
    int a[n];
    for(i=0;i<n;i++)
    {
        scanf("%d",&a[i]);
    }   
    mergesort(a,n);
    printf("\nThe elements after sorting are:");
    for(i=0;i<n;i++)
    {
        printf("%d ",a[i]);
    }
    getch();
    return 0;
}
void mergesort(int a[],int size)
{
    int i,n=size,mid;
    if(n<2)
    return;
    mid=n/2;
    int left[mid],right[n-mid];
    for(i=0;i<mid;i++)
    left[i]=a[i];
    for(i=mid;i<n;i++)
    right[i]=a[i];
    mergesort(left,mid);
    mergesort(right,n-mid);
    merge(left,mid,right,n-mid,a);
}
void merge(int al[],int sl,int ar[],int sr,int a[])
{
    int i=0,j=0,k=0;
    while(i<sl && j<sr)
    {
        if(al[i]<=ar[j])
        {
            a[k]=al[i];
            i++;
        }
        else
        {
        a[k]=ar[j];
        j++;
        }
        k++;
    }
    while(i<sl)
    {
            a[k]=al[i];
            i++;
            k++;
    }
    while(j<sr)
    {
            a[k]=ar[j];
            j++;
            k++;
    }
}

输入:

no of elements:4
5 6 3 1 

输出:

5 16 16 16

【问题讨论】:

  • “无法正常工作”是什么意思?你有一些示例输出吗?
  • @PakkuDon 输入:元素数量:4, 5 6 3 1 输出:5 16 16 16

标签: c algorithm mergesort


【解决方案1】:

看看你的这部分代码:

int left[mid],right[n-mid];
for(i=0;i<mid;i++)
left[i]=a[i];
for(i=mid;i<n;i++)
right[i]=a[i];

您正在访问索引超出数组边界的right 数组。那应该是这样的:

right[i - mid]=a[i];

【讨论】:

    【解决方案2】:

    我有正确的C语言合并排序代码。请与它相符。

    #include<stdio.h>
    
    void mergesort(int a[],int i,int j);
    void merge(int a[],int i1,int j1,int i2,int j2);
    
    int main()
    {
    int a[30],n,i;
    
               printf("Enter no of elements:");
               scanf("%d",&n);
               printf("Enter array elements:");
    
               for(i=0;i<n;i++)
               scanf("%d",&a[i]);
               mergesort(a,0,n-1);
    
    
               printf("\nSorted array is :");
               for(i=0;i<n;i++)
               printf("%d ",a[i]);
               return 0;
    }
    
    void mergesort(int a[],int i,int j)
    {
               int mid;
               if(i<j)
               {
                              mid=(i+j)/2;
                              mergesort(a,i,mid);                         
                              mergesort(a,mid+1,j);                    
                              merge(a,i,mid,mid+1,j);                 
               }
    }
    
    
    void merge(int a[],int i1,int j1,int i2,int j2)
    {
               int temp[50];      
               int i,j,k;
               i=i1;                      
               j=i2;                      
               k=0;
    
               while(i<=j1 && j <=j2)      
               {
                              if(a[i]<a[j])
                                             temp[k++]=a[i++];
                              else
                                             temp[k++]=a[j++];
                }
    
               while(i<=j1)         
                              temp[k++]=a[i++];
    
               while(j<=j2)         
                              temp[k++]=a[j++];
    
    
               for(i=i1,j=0;i<=j2;i++,j++)
                              a[i]=temp[j];
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-28
      • 2017-10-24
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2013-05-15
      • 2023-03-26
      • 1970-01-01
      相关资源
      最近更新 更多