我有一个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;
}
答案 0 :(得分:2)
std::vector
有一个size()
成员函数,它返回向量中的元素个数。 sizeof(first)
返回std::vector<string>
类型object representation的字节数,而这不是您需要的。
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);
答案 1 :(得分:2)
你确定错误的矢量大小:
int size_first = sizeof(first);
int size_second = sizeof(second);
将其替换为
size_t size_first = first.size();
size_t size_second = second.size();