【问题标题】:Merge Sort Using Vectors c++使用向量 c++ 进行合并排序
【发布时间】: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


【解决方案1】:

您在vectors 上执行的所有索引都是从 1 开始的。 C++ 向量(和数组)使用基于 0 的索引。至少,xy 应该初始化为 0,ij 填充循环中的索引应该从 0 开始(适当更改结束条件和循环内的使用),在main 中调用mergeSort 的第二个参数应该是0,而不是1。

【讨论】:

  • 我进行了更改,并取得了一些进展。我要离开老师的伪代码模板。她可能在某个地方解释了它,而我错过了它。现在我的向量变回空白了!我将在上面编辑更多信息。
猜你喜欢
  • 2016-01-29
  • 1970-01-01
  • 2023-03-15
  • 2016-07-22
  • 1970-01-01
  • 1970-01-01
  • 2020-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多