我有以下作业问题:
对数字排序7 12 8 6 9 1 4 3 5 10 11 2 使用合并排序。说明树状结构和 每一步都有分区。 (10分)。
我不知道这是不对的。这就是我的成果:
在第5步,我不知道该怎么做。我在图像上放了一个圆圈。这个程序对吗?我相信这个插图正在回答这个问题。
对不起我应该把圈子放一步。我将圈子放在第6步
感谢您的回答,我最终得到了:
答案 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
拆分为7
和12,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