2016-05-29 6 views
0

私のコードを編集して、明白な間違いを削除しました。私はまだ私のmergesplit関数が再帰的でない理由を見つけることができません。一度だけ実行されます。いくつかの人が私に詳細な解決策を教えてください。MergeSortの再帰

#include<bits/stdc++.h> 

void Merge_Sort(int a[],int p,int q,int mid); 

void Merge_Split(int a[],int p,int q)//recursive function 
{ 
int mid; 
if (p<q) 
{ 
    mid=(p+q)/2; 
    Merge_Split(a,p,mid); 
    Merge_Split(a,mid+1,q); 
    Merge_Sort(a,p,q,mid); 
} 
return; 
} 

void Merge_Sort(int a[], int p,int q,int mid)//sorting function 
{ 
int b[50]; 
int i,j,x; 
for(i=p,j=mid+1,x=p;i<=mid,j<q;) 
{ 
    if(a[j]<=a[i]) 
    b[x++]=a[j++]; 
    else 
    b[x++]=a[i++]; 
} 
while(i<=mid) 
{ 
    b[x++]=a[i++]; 
} 
while(j<=q) 
{ 
    b[x++]=a[j++]; 
} 
for(int i=p;i<q;i++) 
    a[i]=b[i]; 
} 

int main() 
{ 
int a[5],x=0,n=5; 
for(int i=0;i<n;i++) 
    scanf("%d", &a[i]); 
Merge_Split(a,0,5); 
for(int i=0;i<5;i++) 
    printf("%d", a[i]); 
return 0; 
} 

このコードは正常に動作するはずです。私は自分の問題を見つけることができません。親切に助けてください。

+2

'b [x ++] == a [j ++]'、これは割り当てません。 '== 'は代入演算子ではない比較演算子です。さらに、これをC++ 11でタグ付けすると、かなり誤解を招くようです。 – Jack

+0

あなたのコードはMerge_Splitを呼び出すことはなく、Merge_Sortは1回だけ呼び出します(再帰はありません)。 –

+0

ジャックは間違いを指摘してくれてありがとう、そしてn.mはもう少し説明できますか?私は、ちょうど分割されたものとマージソート機能を入れ替えたということです。私はまだ同じ結果を得ています –

答えて

0

あなたは開いた/閉じた間隔でうんざりしていました。あなたのインターバルのタイプを決めたら、あなたのコードとあなたの規約とを一致させます。

Merge_Split(a,0,5)は、左閉じ、右開きの間隔を使用することを示します。これらの変化に

for(i=p,j=mid,x=p;i<mid,j<q;)

while(i<mid)

フルコード:

if (p<q)

Merge_Split(a,p,mid); 
Merge_Split(a,mid,q); 
Merge_Sort(a,p,q,mid); 

そして:その場合

#include<bits/stdc++.h> 

void Merge_Sort(int a[],int p,int q,int mid); 

void Merge_Split(int a[],int p,int q)//recursive function 
{ 
int mid; 
if (p<q - 1) 
{ 
    mid=(p+q)/2; 
    Merge_Split(a,p,mid); 
    Merge_Split(a,mid,q); 
    Merge_Sort(a,p,q,mid); 
} 
return; 
} 

void Merge_Sort(int a[], int p,int q,int mid)//sorting function 
{ 
int b[50]; 
int i,j,x; 
for(i=p,j=mid,x=p;i<mid,j<q;) 
{ 
    if(a[j]<=a[i]) 
    b[x++]=a[j++]; 
    else 
    b[x++]=a[i++]; 
} 
while(i<mid) 
{ 
    b[x++]=a[i++]; 
} 
while(j<q) 
{ 
    b[x++]=a[j++]; 
} 
for(int i=p;i<q;i++) 
    a[i]=b[i]; 
} 

int main() 
{ 
int a[5],x=0,n=5; 
for(int i=0;i<n;i++) 
    scanf("%d", &a[i]); 
Merge_Split(a,0,5); 
for(int i=0;i<5;i++) 
    printf("%d", a[i]); 
return 0; 
} 
+0

私は私に言ったことをやったが、私のコードはまだ動かない。現実には、配列内の要素を入力する際に​​コードが機能しなくなりました。 :( –

+0

[OK]を、私はコード全体を入れます。 – kaspersky