擅长:python、mysql、java
<p>像一堆树一样容易看:</p>
<pre><code> 1
3 9
7 5
</code></pre>
<p>其中每个节点都小于它的子节点,但子节点的顺序是不相关的(这将堆与二进制搜索树区分开来)。在</p>
<p>一个完整的树允许简单地嵌入数组中,方法是按照宽度优先的顺序对节点进行编号,从根开始作为节点1。在</p>
^{pr2}$
<p>通过这种嵌入,以下关系成立:</p>
<ol>
<li><code>li[i] <= li[2*i]</code></li>
<li><code>li[i] <= li[2*i + 1]</code></li>
</ol>
<p><code>2*i</code>和<code>2*i + 1</code>是分别计算位于<code>i</code>的节点的左子节点和右子节点的公式:</p>
<pre><code> + + +
| v v
[1, 3, 9, 7, 5]
| ^ ^
+ -+ +
</code></pre>
<p>(可以为基于0的数组指定这些属性,但使用基于1的数组则更简单。)</p>
<p>这样的列表是<em>堆排序的</em>(这比<em>排序的</em>弱,因为所有排序的列表也是堆排序的),并允许标准堆方法有效地实现。在</p>