gpt4 book ai didi

使用迭代器的 C++ 合并排序

转载 作者:行者123 更新时间:2023-12-04 08:16:31 24 4
gpt4 key购买 nike

目前,我正在尝试创建一个简单的 C++ 合并排序程序。

using namespace std;

using Iterator = std::vector<int>::iterator;
using CIterator = std::vector<int>::const_iterator;
std::vector<int> merge(CIterator left_begin, CIterator left_end, CIterator right_begin, CIterator right_end) {
std::vector<int> result;

CIterator left = left_begin;
CIterator right = right_begin;

while (left != left_end && right != right_end) {
if (*left <= *right) {
result.push_back(*left);
left++;
} else {
result.push_back(*right);
right++;
}
}

while (left != left_end) {
result.push_back(*left);
left++;
}

while (right != right_end) {
result.push_back(*right);
right++;
}

return result;
}
我创建了一个合并函数,它基本上将两个排序的 vector 连接成一个并返回它(我必须使用函数合并的以下返回类型)。然后尝试编写驱动程序函数合并排序我有以下代码,我认为它可以正常工作
void merge_sort(Iterator begin, Iterator end) {
auto difference = distance(begin, end);

if (difference <= 1) {
return;
}

Iterator middle = begin;
advance(middle, difference / 2);

merge_sort(begin, middle);
merge_sort(middle, end);

vector<int> result = merge(begin, middle, middle, end);
// But what to put here?
}
在注释标记的地方,我不明白要写什么才能将排序的数组在递归中向上移动一步。我试过
    begin = result.begin();
end = result.end();
但这显然不起作用

最佳答案

问题在于 merge_sort 的类型签名假设一个就地算法:

void merge_sort(Iterator begin, Iterator end);
但是你的 merge过程不是就地,而是返回数组的合并拷贝。您要么需要更改 merge到位,或者您需要更改 merge_sort返回排序后的数组。后一种解决方案(更简单但效率较低)将是这样的:
std::vector<int> merge_sort(Iterator begin, Iterator end) {
auto difference = distance(begin, end);

if (difference <= 1) {
return;
}

Iterator middle = begin;
advance(middle, difference / 2);

std::vector<int> left = merge_sort(begin, middle);
std::vector<int> right = merge_sort(middle, end);
return merge(left.begin(), left.end(), right.begin(), right.end());
}

关于使用迭代器的 C++ 合并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65675066/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com