python中的堆顺序

时间:2018-05-31 14:25:55

标签: python heap

堆数据结构的新手。

尝试从列表中创建堆。

li = [5, 7, 9, 1, 3]

heapq.heapify(li)

在堆积之后,输出为

[1, 3, 9, 7, 5]

为什么这个订单?
我认为对于最小优先级堆,元素应该从min到max排序,即
heapq.heapify(li)应与li.sort()

相同

有人可以帮我理解吗?

3 个答案:

答案 0 :(得分:2)

将堆视为树更容易:

         1
     3      9
  7     5

其中每个节点都小于其子节点,但子节点的顺序无关紧要(这使得堆与二叉搜索树区分开来。)

完整的树允许通过以广度优先顺序对节点进行编号来简单地嵌入数组,从根开始作为节点1。

         1(1)
     3(2)      9(3)
  7(4)     5(5)

通过这样的嵌入,以下关系成立:

  1. li[i] <= li[2*i]
  2. li[i] <= li[2*i + 1]
  3. 2*i2*i + 1分别用于计算i位置节点的左右子项的公式:

     +--+--+
     |  v  v
    [1, 3, 9, 7, 5]
        |     ^  ^
        +-----+--+
    

    (您可以为基于0的数组指定这些属性,但考虑使用基于1的数组更简单。)

    这样的列表是堆排序(比排序弱,因为所有排序列表也是堆排序的),并允许标准堆方法有效实施。

答案 1 :(得分:0)

堆实际上并没有按照列表排序的相同方式进行排序。 Python没有唯一的堆数据结构,并且使用带有堆操作的列表,这可能是你们某些人混淆的根源。排序(最小优先级)堆是满足&#34;堆条件的堆#34;这样任何子节点都大于其父节点。这并不意味着扁平表示将是有序的。

你的例子在扁平化之前会是这样的:

    1
   / \
  3   9
 / \
7   5

每个节点最多可以有2个子节点,并且始终从左到右添加子节点,直到该行已满。然后通过连接行创建平面表示:[1] + [3, 9] + [7, 5]

答案 2 :(得分:0)

实际上堆排序是半排列算法。主要思想是每个父级应该小于或等于其子级(在最小堆排序中)。 所以我们知道第一个元素是最小的。当我们弹出堆的第一个元素时,下一个最小元素将取代它。
有关更多信息,请参阅以下内容:

heap sort
wikipedia