【发布时间】:2017-01-22 18:16:08
【问题描述】:
我正在尝试使用向量而不是数组的合并排序方法对文本文件进行排序。代码可以构建,但是当我运行它时,我的一个向量出现了超出范围的错误。
具体来说:
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++;
}
}
我调整了向量“v”的大小,但 int K 仍然递增到高。即 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++;
}
}
【问题讨论】:
-
在这里查看我的答案:stackoverflow.com/a/38249167/2642059 你要找的是
sort(begin(vectorReadIn), end(vectorReadIn))。 -
我应该澄清一下,我正在比较各种排序算法的时间复杂度,我被困在合并排序上。我决定使用向量,因为它们可以动态变化,让我免于使用数组。
-
如果可以的话,适合这项工作的工具几乎总是标准提供的工具。您在这里的问题展示了这样一个概念,即作为凡人,您和我即使在实施比较算法时也会经常做出错误的决定。如果你要坚持这种愚蠢的做法,至少应该使用标准的
swap来交换字符串。
标签: c++ sorting vector merge mergesort