是的,因此基本上您要堆并拉出堆中的第一个节点-因为根据排序的方向,保证第一个节点最大/最小。 棘手的事情是首先重新平衡/创建堆。
我需要两个步骤来了解堆的过程-首先将其视为一棵树,将我的脑袋绕开,然后将那棵树变成一个数组,这样可能很有用。
第二部分实际上是首先遍历树的宽度,从左到右将每个元素添加到数组中。 所以下面的树:
73
7 12
2 4 9 10
1
将为{73,7,12,2,4,9,10,1}
第一部分需要两个步骤:
确保每个节点都有两个孩子(除非您没有足够的节点像上面的树中那样做。)
确保每个节点都大于其子节点(如果最小排序则最小)。
因此,要堆积数字列表,您可以将每个数字添加到堆中,然后按顺序执行这两个步骤。
要在上面创建我的堆,我将首先添加10-这是唯一的节点,因此无需执行任何操作。在左侧添加12作为其子级:
10
12
这满足1,但不满足2,因此我将它们四舍五入:
12
10
加7-无所事事
12
10 7
加73
12
10 7
73
10 <73,因此需要交换以下内容:
12
73 7
10
12 <73,因此需要交换以下内容:
73
12 7
10
加2-无事可做
73
12 7
10 2
加4-无事可做
73
12 7
10 2 4
加9
73
12 7
10 2 4 9
7 <9-交换
73
12 9
10 2 4 7
加1-无事可做
73
12 9
10 2 4 7
1
我们有堆:D
现在,您只需从顶部删除每个元素,每次将最后一个元素交换到树的顶部,然后重新平衡树:
减73-将1放下
1
12 9
10 2 4 7
1 <12-交换它们
12
1 9
10 2 4 7
1 <10-交换它们
12
10 9
1 2 4 7
减12-换成7
7
10 9
1 2 4
7 <10-交换它们
10
7 9
1 2 4
减10-换成4
4
7 9
1 2
4 <7-交换
7
4 9
1 2
7 <9-交换
9
4 7
1 2
减9-换成2
2
4 7
1
2 <4-交换它们
4
2 7
1
4 <7-交换它们
7
2 4
1
减7-换成1
1
2 4
1 <4-交换它们
4
2 1
取4-替换为1
1
2
1 <2-交换它们
2
1
取2-替换为1
1
拿1
排序列表,瞧。