C++ 使用向量c+合并排序+;

C++ 使用向量c+合并排序+;,c++,sorting,vector,merge,mergesort,C++,Sorting,Vector,Merge,Mergesort,我正在尝试使用合并排序方法对文本文件进行排序,使用向量而不是数组。代码会生成,但当我运行它时,我在一个向量上得到了一个越界错误 具体而言: 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) =

我正在尝试使用合并排序方法对文本文件进行排序,使用向量而不是数组。代码会生成,但当我运行它时,我在一个向量上得到了一个越界错误

具体而言:

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++;
    }

} 
for(int k=start;k如果(L.at(x)你在<代码>向量>代码中所做的所有索引都是基于1的。C++向量(和数组)使用基于0的索引。至少,<代码> x < /代码>和<代码> y>代码>应该初始化为0,在<代码>索引> i>代码>和<代码> j <代码>人口环路应该从0开始。(对循环条件和使用情况进行适当的更改),调用<代码> >合并> <代码> > <代码>主代码< /COD>应该是0,而不是1。< /P> < P>您在<代码>向量>代码中所做的所有索引都是基于1-Basic的C++向量(和数组)。使用基于0的索引。至少,
x
y
应初始化为0,
i
j
填充循环中的索引应从0开始(适当更改循环中的结束条件和用法),并且调用
main
中的
mergeSort
的第二个参数应该是0,而不是1。

可能重复的请参见我的答案:您要查找的是
排序(开始(vectorReadIn),结束(vectorReadIn))
。我应该澄清一下,我正在比较各种排序算法的时间复杂度,我一直坚持使用合并排序。我决定使用向量,因为它们可以动态变化,并且可以避免我使用数组。如果可以的话,这项工作的正确工具几乎总是标准提供的工具。您在这里的问题说明了一个概念,即凡人即使在实现算法进行比较时,你和我也会经常做出糟糕的决定。如果你要坚持这种愚蠢行为,至少你应该使用标准来交换字符串。可能的重复请参见我的答案:你要找的是
排序(begin(vectorReadIn),end(vectorReadIn))
。我应该澄清一下,我正在比较各种排序算法的时间复杂度,我一直坚持使用合并排序。我决定使用向量,因为它们可以动态变化,并且可以避免我使用数组。如果可以的话,这项工作的正确工具几乎总是标准提供的工具。您在这里的问题说明了一个概念,即凡人即使在实现算法进行比较时,你和我也会经常做出糟糕的决定。如果你要坚持这种愚蠢的行为,至少你应该使用标准来交换字符串。我做了一些更改,我做了一些进一步。我离开了我老师的伪代码模板。她可能对此有所解释这里,我错过了它。现在我的向量返回空白!我将编辑上面的更多信息。我做了更改,我做了一些进一步。我离开了我老师的伪代码模板。她可能在某个地方解释了它,我错过了它。现在我的向量返回空白!我将编辑上面的更多信息。
#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++; 
    }
}