C ++ Merge排序内存问题

时间:2017-01-31 09:23:05

标签: c++ algorithm

我正在尝试编写合并排序算法的实现。 但我无法理解如何正确使用内存。这是我的代码:

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

它有效,但它不会使用内存有效。我该如何改进呢?

1 个答案:

答案 0 :(得分:1)

STL可以使用std :: inplace_merge执行内存占用较少的merge_sort,请参阅例如 http://en.cppreference.com/w/cpp/algorithm/inplace_merge

以下是有关如何完成就地合并的高级描述: STL __merge_without_buffer algorithm?