2017-11-12 15 views
0

3つの要素の配列に対して機能するマージソート用のCコードを作成しましたが、要素の数を増やすとガベージ値が与えられます。これは再帰的なコードなので、このタイプの問題は発生しません。何が間違っているのですか?これは、2,5,1881172767,32718のようなものの出力を与えました。私はこれらのゴミ値の起源を理解していません。Cでのソートコードが正しく動作しない

#include<stdio.h> 

void merge(int *a,int s,int m,int e) 
{ 
    int l1,l2; 
    int c[50]; 
    l1=m-s+1; 
    l2=e-m; 
    int i=0,i1=0,i2=0; 
    while(i1<l1 && i2<l2) 
    { 
    if(a[i1]<a[i2+m+1]) 
    { 
     c[i]=a[i1]; 
     i1++; 
    } 
    else 
    { 
     c[i]=a[i2+m+1]; 
     i2++; 
    } 
    i++; 
    } 

    while(i1<l1) 
    { 
    c[i]=a[i1]; 
    i1++; 
    i++; 
    } 
    while(i2<l2) 
    { 
    c[i]=a[i2+m+1]; 
    i2++; 
    i++; 
    } 

    for(i=0;i<=e;i++) 
    { 
    a[i]=c[i]; 
    } 
} 


void mergesort(int *a,int s,int e) 
{ 
    int m; 
    if(s<e) 
    { 
    m=(s+e)/2; 
    mergesort(a,s,m); 
    mergesort(a,m+1,e); 
    merge(a,s,m,e); 
    } 
} 

void main() 
{ 
    int i; 
    int a[4]={3,2,1,5}; 
    mergesort(a,0,3); 

    for(i=0;i<4;i++) 
    printf("%d,",a[i]); 
} 
+3

デバッガを使用してステップを実行します。 – zerkms

+1

_ "" _のような出力を投稿しないでください。 **正確な出力を投稿し、代わりに期待したものを投稿してください。 –

+1

より意味のある変数名を使用してください。 –

答えて

1

aまたはcの要素にアドレッシングするときにオフセットを追加するのを忘れてしまった。 s == 0であれば問題ありません。しかし、配列が大きくなると、配列の最初の部分にのみ要素がコピーされ、最後の要素は初期化されません。

あなたのコード

if(a[i1]<a[i2+m+1]) 
    { 
    c[i]=a[i1]; 
    i1++; 
    } 

v.grは、あなたのコード内でこのさらに

if(a[i1+s]<a[i2+m+1]) 
    { 
    c[i+s]=a[i1+s]; 
    i1++; 
    } 

正しいはずです。

通常、このような操作では、Cはポインタを使用することを好みます。

+0

ありがとうたくさんの人..本当にありがとう – DuttaA

関連する問題