2017-05-11 3 views
0

私は以下のコードをcで書いていますが、次のプログラムの出力は常にガーベジの値の配列です、私のすべての整数はどこかで失われています。です。 はあなたに感謝:)あなたは二番目の配列におけるいくつかの要素が正しい場所にまだない間、アレイの1のすべての要素の一つが、結果に置かれた状態をチェックしていないマージソートは出力としてガーベッジの値を与えています

#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 <= end'のときの条件を考慮していません。 –

+0

コードを書式設定する必要があります。 –

+1

ようこそStackOverflowへ。 [ツアー]を取ってください。 よくある質問stackoverflow.com/help/how-to-ask、 [mcve]を作成してください。 Mcveには、サンプルインアウト、所望の出力、実際の出力、およびそれがどのように失敗するか、すなわちそれが「ゴミ」になるものが含まれているべきである。コードに適切な書式設定とインデントを使用します。 デバッグコードのヘルプをお探しの場合は、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 - あなたのvoid merge(int a[],int beg,int mid,int end)機能で4

第三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

なぜ2つのwhileループを使用しているのですか?私はそれを取得しませんでした。あなたのソリューションはすごくうまくいくが、以前は何がどうやって間違っていたのかを知りたい。あなたが私を怒らせれば申し訳ありません – LOKI

+0

@LOKI私の答えで述べた配列を考えてみましょう。マージプロシージャ 'p1 - {1,2,3,4,10}'と 'p2 - {11,12,13,14}'を適用すると。 3番目のforループはp1のすべての要素をコピーし、p2はコピーされません。 'p1'の全ての要素が' p2'より小さいからです。しかし、あなたの3番目のループはstil 'k n1'となり、コードは論理的に間違っていることに注意してください。私のコードでは、条件が「i

+0

ありがとう私はそれを持ってくれました:) もう1つ質問、 誰かが私は何かが発生する可能性があることを教えてくれるいくつかの問題を引き起こす可能性がありますmallocをtypecasteしてはいけないとコメントしましたか? – 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; 
} 
関連する問題