2010-11-24 9 views
-1

それは、ファイルのm行mに操作だんマージソートは、各上ダブルスメートルをマージし、ここで渡すコードボトムアップマージ

#include <iostream> 
#include <vector> 
using namespace std; 

inline int Min(int a,int b) 
{ 
    return a<b?a:b; 
} 

void merge(int a[],int l,int m,int r) 
{ 
    vector<int>b; 
    int i, j; 
    for (i=m+1;i>=l;i--) b[i-1]=a[i-1]; 
    for (j=m;j<r;j++) b[r+m-j]=a[j+1]; 
    for (int k=l;k<=r;k++) 
     if (b[j]<b[i]) 
      a[k]=b[j--]; 
     else 
      a[k]=b[i++]; 
} 

void mergesort(int a[],int l,int r) 
{ 
    for (int m=1;m<=r-l;m=m+m) 
     for (int i=l;i<=r-m;i+=m+m) 
      merge(a,i,i+m-1,Min(i+m+m-1,r)); 
} 

int main() 
{ 
    int a[]={12,4,7,3,9,8,10,11,6}; 
    int n=sizeof(a)/sizeof(int); 
    mergesort(a,0,n-1); 
    for (int i=0;i<n;i++) 
    { 
     cout<<a[i]<< " "; 
    } 

    return 0; 
} 

ですが、私はこのコードを実行すると例外がありますこれは、範囲エラーのベクトルのうちは、あなたが空のベクターとしてbを作成し、その要素に取り組む開始

+0

例外はどの回線から発生していますか?どんな要素にアクセスしようとしていましたか、そしてそのベクトルがどれくらい大きいと思いますか?その時点であなたのコールスタックはどれくらい深いですか?インデックスが範囲外かどうか、i、j、またはkですか? 正直なところ、@ user466441、あなたの質問のほとんどは、情報や努力なしに、「ここにはたくさんのコードがあり、助けてください」というものです。 – abelenky

+0

あなたのコードを再フォーマットしました。しかし、より一貫した書式設定でも、貧弱な変数名、括弧の一貫しない使用、およびfor単一行のステートメントは修正されません。 – abelenky

答えて

1

助けてください起こったことを述べています。サイズは0なので無効です。あなたはもっと大きなサイズを与えるべきです。

2

ベクトルを初期化しておらず、データが入っていません。

私はこれがあなたが車輪を再発明している理由であると思います。私はそれがあなたのコードを理解しにくくする一文字の識別子を使用するための言い訳であるとは確信していません。

配列であり、lはその長さであるならば、あなたは

vector<int> b(a, a+l); 

は、おそらくあなたは、ソートの目的のために、あなたの配列の一時的なクローンを作成しているとBを初期化することができます。

mergesortは再帰的ではありませんか?私はあなたの存在を見ません。

あなたのインデントは、forループがネストされていることを示唆していますが、for文と同じ行にあるステートメントの後のセミコロンはそうでないことを示唆します。あなたのループには常にカッコを使用することをお勧めします。あなたがvector<int>b; Bを持ってmerge

+1

これは、ボトムアップとは、呼び出し再帰的ではなくループ再帰的なことを意味します。 –

2

機能では、ここではサイズ0です。あなたのベクトルをrezise()、または配列でそれを初期化する必要があります。

vector<int> v(arr, arr+size); 
1

その他には、空のベクターでインデックス要素にしようとして問題に対処してきました。また、次のループでは問題があります。

for (i=m+1;i>=l;i--) b[i-1]=a[i-1]; 

ループを通る最後の反復がi=l持ちのあなたは、ベクター/配列の[i-1]要素に取り組みます。 l=0の場合、これはインデックス-1であり、ベクトルと配列の両方で範囲外です。