合并排序树就像结构一样

时间:2012-03-03 03:04:22

标签: algorithm mergesort

我有以下作业问题:

  

对数字排序7 12 8 6 9 1 4 3 5 10 11 2   使用合并排序。说明树状结构和   每一步都有分区。 (10分)。

我不知道这是不对的。这就是我的成果: enter image description here

在第5步,我不知道该怎么做。我在图像上放了一个圆圈。这个程序对吗?我相信这个插图正在回答这个问题。

修改

对不起我应该把圈子放一步。我将圈子放在第6步


最终编辑

感谢您的回答,我最终得到了:

enter image description here

4 个答案:

答案 0 :(得分:2)

我认为第5行的树应该是这样的:

7 | 12 | 8 | 6 | 9 | 1 | 4 | 3 | 5 | 10 | 11 | 2

7 |  8,12  | 6 |  1,9  | 4 |  3,5  | 10 | 2,11

  7,8,12   |   1,6,9   |   3,4,5   | 2,10,11

      1,6,7,8,9,12     |    2,3,4,5,10,11

          1,2,3,4,5,6,7,8,9,10,11,12

为什么呢?因为您在第3行将组7,12,8拆分为712,8。由于递归的工作原理,您必须先合并8,12才能合并所有三个元素。

答案 1 :(得分:2)

您有箭头的行是错误的。树的左侧,从头开始,看起来像这样

{7,12,8,6,9,1}
{7,12,8} {6,9,1}
{7}, {12,8}, {6}, {9,1}

现在因为所有集合的大小都是1或2,我们排序然后合并:

{7}, {8,12}, {6}, {1,9}
{7,8,12} {1,6,9}
{1,6,7,8,9,12}

右侧留给读者练习;)

答案 2 :(得分:1)

我写了一些代码,可以帮助你解决部分答案。它修改算法以存储深度,并将每个列表的顺序传递给mergesort。

您需要调整merge(),以便它也记录merge()返回的结果。

请注意两个全局变量用于跟踪,深度参数是唯一的修改。

# Retrieved from: http://en.literateprograms.org/Merge_sort_(Python)?oldid=16663

glob_lists=[]
glob_order=0

def merge(left, right):
    result = []
    i ,j = 0, 0
    while i < len(left) and j < len(right):
        if left[i] <= right[j]:
            result.append(left[i])
            i += 1
        else:
            result.append(right[j])
            j += 1

    result += left[i:]
    result += right[j:]
    return result

def mergesort(_list,depth):
    global glob_order
    global glob_lists
    glob_order+=1
    glob_lists.append((depth,glob_order,_list))
    if len(_list) < 2:
        return _list
    else:
        middle = len(_list) / 2
        left = mergesort(_list[:middle],depth+1)
        right = mergesort(_list[middle:],depth+1)
        return merge(left, right)

if __name__ == "__main__":
    print mergesort([7,12,8,6,9,1,4,3,5,10,11,2],0)

glob_lists.sort()
print glob_lists

from itertools import groupby

for depth,g in groupby(glob_lists,key=lambda i:i[0]):
    g = [i[-1] for i in g]
    print depth," "*(10-len(g))," | ".join(map(str,g))

0           [7, 12, 8, 6, 9, 1, 4, 3, 5, 10, 11, 2]
1          [7, 12, 8, 6, 9, 1] | [4, 3, 5, 10, 11, 2]
2        [7, 12, 8] | [6, 9, 1] | [4, 3, 5] | [10, 11, 2]
3    [7] | [12, 8] | [6] | [9, 1] | [4] | [3, 5] | [10] | [11, 2]
4    [12] | [8] | [9] | [1] | [3] | [5] | [11] | [2]

答案 3 :(得分:0)

完成拆分并拥有单个数字后,突出显示的行会再次将所有数字合并在一起,但这次它们将按顺序放回。 中间行也是到达最后一个递归层的行。

维基百科虽然你可能已经检查过,但实际上已经有了很好的解释 http://en.wikipedia.org/wiki/Mergesort