【问题标题】:Trying to understand merge sort program试图理解归并排序程序
【发布时间】:2019-06-09 14:30:25
【问题描述】:

我正在努力理解归并排序程序。为了理解我编写了这个程序但无法理解输出。如果有人解释输出将非常有帮助。直到mid=0我才明白。

 #include <iostream>

 using namespace std;

 void check(int c, int d) {
     cout << "C=" << c << " D=" << d << endl;

     if (c < d) {
         int mid = (c + d) / 2;
         cout << "mid=" << mid << endl;
         check(c, mid);
         check(mid + 1, d);
     }
}

int main() {
    // int a[12] = { 2, 3, 1, 6, 9, 112, 113, 224, 225, 226, 332, 2303 };

    check(0, 5);
    return 0;
}

输出:

C=0 D=5 中=2 C=0 D=2 中=1 C=0 D=1 中=0 C=0 D=0 C=1 D=1 C=2 D=2 C=3 D=5 中=4 C=3 D=4 中=3 C=3 D=3 C=4 D=4 C=5 D=5

【问题讨论】:

标签: c++ mergesort


【解决方案1】:

请注意,这是基于自上而下的归并排序,这在学习中很流行,但大多数库都使用自下而上归并排序的变体。就输出而言,自上而下的归并排序生成索引并将其推送到堆栈上,从而形成深度优先、左优先的排序。在产生 2 次大小为 1 的运行之前,不会发生合并。我更改了代码以显示递归级别 l 以及递归调用是第一个还是第二个 x:

#include <iostream>

using namespace std;

void check(int c, int d, int l, int x) {
    if(c >= d){
        cout << "l = " << l << "  x = " << x;
        cout << "  c = " << c << "         d = " << d << endl;
        return;
    }
    int m = (c + d) / 2;
    cout << "l = " << l << "  x = " << x;
    cout << "  c = " << c << "  m = " << m << "  d = " << d << endl;
    check(c, m, l+1, 1);
    check(m + 1, d, l+1, 2);
}

int main() {
    check(0, 5, 0, 0);
    return 0;
}

这是输出:

l = 0  x = 0  c = 0  m = 2  d = 5
l = 1  x = 1  c = 0  m = 1  d = 2
l = 2  x = 1  c = 0  m = 0  d = 1
l = 3  x = 1  c = 0         d = 0
l = 3  x = 2  c = 1         d = 1
l = 2  x = 2  c = 2         d = 2
l = 1  x = 2  c = 3  m = 4  d = 5
l = 2  x = 1  c = 3  m = 3  d = 4
l = 3  x = 1  c = 3         d = 3
l = 3  x = 2  c = 4         d = 4
l = 2  x = 2  c = 5         d = 5

【讨论】:

    猜你喜欢
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2010-11-20
    • 2021-06-22
    • 2015-07-04
    相关资源
    最近更新 更多