我有一个 C++ 代码,它应该使用合并排序算法对一个包含 800,000 多个单词的文件进行排序,每个单词在一个新行上。
我做了什么 ?
首先,我尝试实现以下合并排序算法并尝试在一小部分输入上对其进行测试。我无法弄清楚我在哪里得到了向量的索引越界错误。如果有人能帮我解决这个问题,我将不胜感激
#include <fstream>
#include <iostream>
#include <vector>
using namespace std;
vector<string> merge(const vector<string>& first,
const vector<string>& second) {
// Write your code to merge vectors first and
// second onto result.
vector<string> output;
int i = 0;
int j = 0 ;
int size_first = sizeof(first);
int size_second = sizeof(second);
while(i < size_first || j < size_second){
if (i < size_first && j < size_second){
if (first.at(i) < second.at(j)){
output.push_back(first.at(i));
i++;
}
else{
output.push_back(second.at(i));
j++;
}
}
else if (i < size_first){
output.push_back(first.at(i));
i++;
}
else{
output.push_back(second.at(j));
j++;
}
}
return output;
}
void mergeSort(vector<string>& words) {
if (words.size() <= 1)
{
return;
}
int n = words.size();
int middle = n/2;
vector<string> first_half(middle);
for (int i = 0; i < middle; ++i) {
first_half[i] = words[i];
}
vector<string> second_half(n - middle);
for (int i = middle; i < n; ++i) {
second_half[i - middle] = words[i];
}
words = merge(first_half, second_half);
}
void sort(vector<string>& words) {
// Invoke mergeSort here.
mergeSort(words);
}
int main(){
vector<string> names;
names.push_back("Smith");
names.push_back("Abinash");
names.push_back("Ciara");
names.push_back("Reeta");
sort(names);
return 0;
}
std::vector
有一个size()
成员函数,返回向量中元素的数量。sizeof(first)
返回类型的对象表示的字节大小std::vector<string>
,这不是您需要的。
int size_first = sizeof(first);
int size_second = sizeof(second);
应该换成
int size_first = first.size();
int size_second = second.size();
你有一个错字:
else {
output.push_back(second.at(i));
j++;
}
应该
...
output.push_back(second.at(j))
还有一个。你忘记了主要的事情 -mergeSort
在调用之前调用零件merge
。应该:
mergeSort(first_half);
mergeSort(second_half);
words = merge(first_half, second_half);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句