2017-01-22 8 views
1

配列の代わりにベクトルを使用するマージソート方法を使用してテキストファイルをソートしようとしています。コードはビルドされますが、私がそれを実行すると、私のベクトルの一つにアウト・バウンド・エラーが発生します。具体的にベクトルを使用したマージソートC++

for (int k = start; k < end; k++) 
{ 
    if (L.at(x) <= R.at(y)) 
    { 
     v.at(k) = L.at(x);   // out of bounds 
     x++; 
    } 
    else 
    { 
     v.at(k) = R.at(y);   // out of bounds 
     y++; 
    } 

} 

は私がint Kは依然として高にインクリメントまだベクトル 'V' をリサイズします。つまり、vの大きさは10になりますが、kは10にもなります。いくつかの値を変更しようとしましたが、コンパイルするたびにソートされません。私はさまざまなマージソートの方法を調べてきましたが、同じ範囲を超えて同じエラーが出るごとに、

編集:私は私のループに変更を加えました。今では私の機能を通過します。しかし、彼らは空のベクトルを返します。 'v'ベクトル全体は、それを印刷すると空白です。

全コード:

#include <iostream> 
#include <fstream> 
#include <string> 
#include <vector> 
#include <algorithm> 

using namespace std 

vector<string> readFile(string fileName) { 
    /* reads a textfile into vector. Works dandy. */ 
} 

vector<string> merge(vector<string>& v, int start, int mid, int end) { 
    int n1 = mid - start + 1; 
    int n2 = end - mid; 

    vector<string> L; 
    vector<string> R; 

    L.resize(n1 + 1); // size left vector 
    R.resize(n2 + 1); // size right vector 

    for (int i = 1; i < n1; i++) { 
     L.at(i) = v.at(start + i - 1); // populate left vector 
    } 
    for (int j = 1; j < n2; j++) { 
     R.at(j) = v.at(mid + j);  // populate right vector 
    } 

    int x = 1; 
    int y = 1; 

for (int k = start; k < end; k++) 
{ 
    if (L.at(x) <= R.at(y)) 
    { 
     v.at(k) = L.at(x);   // merge left vector into v 
      if (x < L.size() - 1) // prevents x from increasing past bounds of L vector 
      x++; 
    } 
    else 
    { 
     v.at(k) = R.at(y);   // merge right vector into v 
     y++; 
    } 
    return v; 
} 

vector<string> mergeSort(vector<string>& v, int start, int end) { 
    int middle; 
    if (start < end)     // base case 
    { 
     middle = (start + end)/2;  // find middle 
     mergeSort(v, start, middle); // divide vectors 
     mergeSort(v, middle + 1, end); 
     merge(v, start, middle, end); // merge sorted vectors 
    } 
    return v; 
} 

int main() { 
    vector<string> vectorReadIn; 
    vector<string> sortedVector; 
    int x = 0; 

    string fileName = "C:/Users/User/Downloads/Algorithims/Perm Words/perm15k.txt"; 

    vectorReadIn = readFile(fileName); // reads file into vector 

    sortedVector = mergeSort(vectorReadIn, 1, vectorReadIn.size()); // calls mergesort 
    cout << "Sorted file:" << endl; 
    while (x < 8) { 
     cout << sortedVector.at(x); 
     x++; 
    } 
} 
+0

[ビルドされた関数(または他の方法)を使用してC++で2次元配列をソートするか?](http://stackoverflow.com/questions/20931669/sort- a-2d-array-in-c-built-in-function-any-other-method) –

+0

私の答えを見てください:http://stackoverflow.com/a/38249167/2642059あなたが探しているものは'sort(begin(vectorReadIn)、end(vectorReadIn))'です。 –

+0

私は明確にすべきです、私はさまざまなソートアルゴリズムの複雑さを比較しています。そして、私はマージソートに固執しています。私はベクトルを使うことに決めました。 –

答えて

0

あなたvectorsにやっているすべてのインデックスは1ベースです。 C++ベクタ(および配列)は0ベースのインデックスを使用します。最低でもxyは0に初期化する必要があります。ijの集計ループのインデックスは0(開始条件とループ内での使用方法を適切に変更)で開始し、2番目のパラメータはmergeSortmainは0でなく1でなければなりません。

+0

私は変更を加え、もう少し手に入れました。私は先生の擬似コードテンプレートから出ていた。彼女はおそらくどこかでそれを説明していて、私はそれを逃した。今私のベクトルは空白に戻ってくる!私は上記の詳細を編集します。 –

関連する問題