具有递归排序算法的决策树

时间:2011-07-10 04:26:28

标签: algorithm decision-tree

我想知道是否有人可以帮助我了解如何为递归排序创建决策树。我知道如何使用冒泡排序或插入排序来完成它。但是,当谈到递归排序时,我无法想象它。如果伪代码类似于:

if length == 1
    return;
else
    int elem = head of array;
    array tail = tail of array;
    recursive sort;
    if (elem <= head of sorted list)
        add elem to the beginning of sorted list
    else
        swap elem and first element of sorted list
        sort smaller list again
        add elem to the beginning of sorted list
return

我最初的想法是决策树看起来如下:

                               A, B, C
                           yes /     \ no  is length <= 1?
                              /       \
                                      remove head
                                        /   \
                                       A    B, C
                                        yes /   \ no  is length <= 1?
                                           /     \
                                                remove head
                                                  /   \
                                                  B   C
                                                 yes /   \ no   is length <= 1?
                                                    /     \
                                                 B:C
                                                /   \
                                              B,C   C,B
                                             |         |
                                          A:B,C       A:C,B
                                         /   \        /   \
                                     A,B,C   B:A,C  A,C,B  C:A,B
                                             /  \          /   \
                                        B,A,C   A:B,C   C,A,B  A:C,B

我显然在某个地方出错了,我不太确定在哪里。我在这里走在正确的轨道上吗?

感谢您提供给我的任何指示。

2 个答案:

答案 0 :(得分:0)

(这是家庭作业吗?)

再次查看您的代码!您目前正在if-then-else构造内部分支。解决这个问题,你应该得到一个正确的结果。

此外,你正在那里展开调用堆栈,所以重新启动会更“正确”。 Wikipedia可能会让您知道这是如何运作的。

祝你好运!

答案 1 :(得分:0)

根据您的陈述,结果将是这样的:

                            A, B, C
                       yes /     \ no  is length <= 1?
                          /       \
                                  remove head
                                    /   \
                                   A    B, C
                                    yes /   \ no  is length <= 1?
                                       /     \
                                            remove head
                                              /   \
                                              B   C
                                             yes /   \ no   is length <= 1?
                                                /     \
                                             B:C
                                            /   \
                                          B,C   C,B
                                         |         |
                                      A:B,C       A:C,B
                                     /   \        /   \
                                 A,B,C   B:A,C  A,C,B  C:A,B
                                         /  \          /   \
                                    B,A,C   **B,C,A**   C,A,B  **C,B,A**

在最后一步中,您决定是否需要交换或左侧的两个是否已排序。如果它们是,则没有必要继续排序,因为右侧是排序的,如果它们不是,你首先交换最左边的元素,然后在右边排序两个。

例如,B:A,C --swap-&gt;答:B,C - 排序 - &gt; A,B,C或A,C,B。

我希望它可以帮到你。