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