2017-09-14 4 views
1

私は宿題としてMergeSortを実装しようとしています。私は入力ベクトルをとるMergeSortという関数を与えられています。次に、私はスプリットとマージ機能が与えられました。ベクトルを分割する際の無限ループ

私はMergeSortの仕組みを知っていますが、私はJavaで複数回実装していますが、私はいつも配列を使用していましたが、ポインタと参照に関して多くの経験はありませんでした。ここで

は、私がこれまで持っているもので、

void Split(const std::vector<int>& input, std::vector<int>* output1, std::vector<int>* output2) { 



    std::cout << "In split function" << std::endl; 
    // this just prints the values in my vector 
    for (int i = 0; i < input.size(); i++) { 
     std::cout << input[i] << ", "; 
    } 
    std::cout << std::endl; 

    if (input.size() > 1) { 


     int i = 0; 
     int j = input.size(); 

     while (i <= j) { 
      output1->push_back(input[i]); 
      i++; 


      if (i != j) { 
       output2->push_back(input[j]); 
       j--; 
      } 
     } 



     std::vector<int> left= {}; 
     std::vector<int> right = {}; 

     Split(*output1, &left, &right); 
     Split(*output2, &left, &right); 
    } 
} 

void MergeSort(std::vector<int>* input){ 
    std::vector<int> output1= {}; 
    std::vector<int> output2 = {}; 
    std::cout << "Starting mergesort" << std::endl; 
    Split(*input, &output1, &output2); 

} 

はまた、私は私の問題への関連性がないため、含めたくないマージ機能を持っています。

今、私のコードはコンパイルされますが、無限ループに陥ってsegfaultを与えてしまいます。

私は値をマージ関数を呼び出す主な機能を持っている:{3、5、1、2、9、4}

分割関数が呼び出され、次にこれがちょうど終了までstdoutに印刷されています:

In split function 3, 5, 1,

は、なぜ私はこのループで立ち往生していますか?

+1

(J = input.size 'と'入力[j]が ')'つによって境界を超えての基本ケースで終了に至る、output1配列が実際{3, 5}を縮小します... –

+0

あなたは約1分ステファンで私にそれを打つ。 –

答えて

2

コメントが指摘したように、この配列のインデックスは間違っています。このため

int i = 0; 
int j = input.size(); 

、あなたのループは再帰がワンセグ障害につながるまで、再度、{3, 5, 1}を生産、Split(...)に供給される{3, 5, 1}、ことoutput1を生成してしまいます。

int i = 0; 
int j = input.size() - 1; 

これはif(input.size() > 1)

+0

私は 'j'を固定しましたが、今度は{3、5}のために無限にループしてから、私にsegfaultを与えます。 –

関連する問題