合并排序不显示正确的输出

时间:2014-10-11 05:57:19

标签: c algorithm mergesort

我已经实现了每行合并排序算法,无法找到错误。 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

2 个答案:

答案 0 :(得分:3)

查看代码的这一部分:

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];

答案 1 :(得分:0)

我有用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];
}