我正在尝试编写合并排序算法的实现。 但我无法理解如何正确使用内存。这是我的代码:
void merge(vector<int>::iterator begin1, vector<int>::iterator end1,
vector<int>::iterator begin2, vector<int>::iterator end2,
vector<int>::iterator out) {
while (begin1 != end1) {
if (*begin1 <= * begin2 || begin2 == end2) {
*out++ = *begin1++;
} else {
*out++ = *begin2++;
}
}
while (begin1 < end1) {
*out++ = *begin1++;
}
while (begin2 < end2) {
*out++ = *begin2++;
}
}
void merge_sort(vector<int> &v) {
unsigned long n = v.size();
if (n == 1) {
return;
}
vector<int> v1;
v1.assign(v.begin(), v.begin() + n/2);
vector<int> v2;
v2.assign(v.begin() + n/2, v.end());
merge_sort(v1);
merge_sort(v2);
merge(v1.begin(), v1.end(), v2.begin(), v2.end(), v.begin());
v1.clear();
v2.clear();
}
它有效,但它不会使用内存有效。我该如何改进呢?
答案 0 :(得分:1)
STL可以使用std :: inplace_merge执行内存占用较少的merge_sort,请参阅例如 http://en.cppreference.com/w/cpp/algorithm/inplace_merge
以下是有关如何完成就地合并的高级描述: STL __merge_without_buffer algorithm?