2017-05-11 50 views
0

我已经写了下面的代码在C,但下面的程序的输出始终垃圾值的数组,我所有的输入整数要去哪里丢失,请帮助,告诉我什么,在哪里错误是。 谢谢:)归并排序是给垃圾值作为输出

#include<stdio.h> 
#include<malloc.h> 

void merge(int a[],int beg,int mid,int end) 
{ 
    int n1=mid-beg+1; 
    int n2=end-mid; 
    int i=0,j=0,k=0; 

    int *p1 = (int*)malloc((n1)*sizeof(int)); 
    int *p2 = (int*)malloc((n2)*sizeof(int)); 

    for(i=0;i<n1;i++) 
     p1[i]=a[beg+i]; 

    for(j=0;j<n2;j++) 
     p2[j]=a[mid+1+j]; 
    i=j=0; 

    for(k=beg;k<=end;k++) 
    { 
     if(p1[i]<=p2[j]) 
     { 
      a[k]=p1[i]; 
      i=i+1; 
     } 
     else { 
      a[k]=p2[j]; 
      j=j+1; } 
    } 
} 
void merge_sort(int a[],int beg,int end) 
{ 
    if(beg<end) 
    { 
     int mid=(beg+end)/2; 

     merge_sort(a,beg,mid); 
     merge_sort(a,mid+1,end); 
     merge(a,beg,mid,end); 
    } 
} 
void main() 
{ 
    printf("Enter Array of size 10:\n"); 
    int a[10],i; 
    for(i=0;i<10;i++) 
     scanf("\n%d",&a[i]); 

    int n=sizeof a/sizeof a[0]; 

    merge_sort(a,0,n-1); 

    printf("\nSorted array is:\n"); 
    for(i=0;i<10;i++) 
     printf("%d\n",a[i]); 

} 
+0

你没有考虑到'i> = n1'或'j> = n2'但仍然是'k <=结束'的情况。 –

+0

而且你需要格式化你的代码。 –

+1

欢迎来到StackOverflow。 请参考[游览], 学习问好问题stackoverflow.com/help/how-to-ask, 做个[mcve]。 Mcve应该包含样本inout,期望的产量,实际产量以及它如何失败,即是什么使其成为“垃圾”。为您的代码使用正确的格式和缩进。 如果您正在寻找与调试代码帮助看https://ericlippert.com/2014/03/05/how-to-debug-small-programs/ – Yunnosch

回答

0

您还没有检查,其中阵列中的一个的所有元素中的一个放置在结果而第二阵列中的某些元素仍然没有在正确的位置的条件。

只是为了理解尝试在下面输入运行您merge程序 -
a - {1,2,3,4,10,11,12,13,14}
beg - 0
end - 8
mid - 4

在你void merge(int a[],int beg,int mid,int end)功能取代第三for环有 -

for(k=beg;i<n1 && j<n2;k++) 
{ 
    if(p1[i]<=p2[j]) 
     a[k]=p1[i++]; 
    else 
     a[k]=p2[j++]; 
} 
while(i<n1) 
    a[k++] = p1[i++]; 
while(j<n2) 
    a[k++] = p2[j++]; 
+0

为什么我们在最后使用两个while循环?我没有得到它。你的解决方案运作良好,但我想知道以前如何以及出了什么问题。对不起,如果我生气了 – LOKI

+0

@LOKI考虑我在我的答案中提到的数组。当你应用合并过程'p1 - {1,2,3,4,10}'和'p2 - {11,12,13,14}'。现在第三个for循环将复制p1的所有元素,而没有p2被复制。因为'p1'的每个元素都小于'p2'。但是你的第三个循环不会以s#k结束。请注意,在这一点上,'i> n1'和代码在逻辑上是错误的。在我的代码中,我检查条件'i

+0

感谢兄弟我得到了:) 多一个问题, 有人评论说,我不应该typecaste malloc它可以导致一些问题,你可以告诉我会发生什么? – LOKI

0

合并的功能是错误的。以下内容可以工作。

#include <stdio.h> 
#include <malloc.h> 

void merge(int a[],int beg,int mid,int end) 
{ 
    int n1=mid-beg+1; 
    int n2=end-mid; 
    int i=0,j=0,k=0; 

    int *p1 = (int*)malloc((n1)*sizeof(int)); 
    int *p2 = (int*)malloc((n2)*sizeof(int)); 

    for(i=0;i<n1;i++) 
     p1[i]=a[beg+i]; 

    for(j=0;j<n2;j++) 
     p2[j]=a[mid+1+j]; 
    i=j=0; 

    for(k=beg;k<=end;k++) 
    { 
     if (j >= n2 || (i < n1 && p1[i]<=p2[j])) 
     { 
      a[k]=p1[i]; 
      i=i+1; 
     } 
     else 
     { 
      a[k]=p2[j]; 
      j=j+1; 
     } 
    } 
} 

void merge_sort(int a[],int beg,int end) 
{ 
    if(beg<end) 
    { 
     int mid=(beg+end)/2; 

     merge_sort(a,beg,mid); 
     merge_sort(a,mid+1,end); 
     merge(a,beg,mid,end); 
    } 
} 

int main() 
{ 
    printf("Enter Array of size 10:\n"); 
    int a[10],i; 
    for(i=0;i<10;i++) 
     scanf("\n%d",&a[i]); 

    int n = sizeof a/sizeof a[0]; 

    merge_sort(a,0,n-1); 

    printf("\nSorted array is:\n"); 
    for(i=0;i<10;i++) 
     printf("%d\n",a[i]); 

    return 0; 
}