2017-05-11 49 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; 
}