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

vnikonov_63

当前,我正在尝试创建一个简单的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;
}

我创建了一个合并函数,该函数基本上将两个排序的向量连接为一个并返回它(我必须使用函数合并的以下返回类型)。然后尝试编写驱动程序功能合并排序,我有以下代码,我认为工作正常

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());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C中的嵌套合并排序不起作用

来自分类Dev

C ++ 11多线程合并排序

来自分类Dev

在合并排序C ++中使用合并时的随机值

来自分类Dev

在Int C ++数组上合并排序

来自分类Dev

使用向量合并排序(int)C ++

来自分类Dev

合并排序的怪异输出。的项不是2的幂。-c

来自分类Dev

合并排序循环链表C

来自分类Dev

是否可以使用合并排序(C#)根据多个条件对数组进行排序?

来自分类Dev

C ++中合并排序算法的怪异行为

来自分类Dev

在C ++中合并排序

来自分类Dev

C ++多线程-与线程合并排序的算法替代

来自分类Dev

CRLS合并排序边界代码对C代码的理解

来自分类Dev

在Objective-C中合并排序

来自分类Dev

C ++递归字符串合并排序

来自分类Dev

迭代合并排序的C ++实现由于堆栈溢出而在大输入大小时崩溃

来自分类Dev

Rust实现合并排序的迭代器

来自分类Dev

合并排序不正确的排序(C ++)

来自分类Dev

在C中调试合并排序实现

来自分类Dev

合并排序分段错误c ++

来自分类Dev

C ++-合并排序-无法识别错误

来自分类Dev

C ++合并排序算法,用于可变大小的数组

来自分类Dev

C ++溢出,合并排序,反转计算器

来自分类Dev

C中的合并排序算法无法正常工作

来自分类Dev

我正在尝试使用c ++中的向量来实现(算法简介(CLRS))中的合并排序算法,但数组未排序,

来自分类Dev

迭代Java合并排序

来自分类Dev

双向链表 C++ 上的合并排序

来自分类Dev

合并排序(分段错误(Xore Dumped))C++

来自分类Dev

C++中的合并排序代码实现

来自分类Dev

c - 如何在c中使用指针合并排序字符串数组?