确定数字列表是否按堆顺序排列,Python 3.2

时间:2013-05-07 08:34:20

标签: python sorting python-3.x heap python-3.2

我刚刚发现了堆(在现实生活中和在Python中),现在我正在尝试确定某个随机数列表是否按堆顺序排列。
问题是我不确定自己是否真的理解“堆”在实践中,即使我相信提供的定义是有道理的。

我发现了一些可以帮助你编写堆伪代码的练习题。 这就是问题所在,我的尝试是解决它:

编写一个检查数字列表是否为堆的函数:

给定一个列表,如果数字是堆排序,则返回True;如果数字不是,则返回False,并返回程序并打印答案。

示例:

  • 返回True: 以下列表按堆顺序排列:[0,1,10,2,3,11,12,4,5,19,15]
  • 返回False 以下列表不按堆顺序排列:[0,1,10,2,15,11,12,4,5,19,3]

然后有2个列表,其中有一堆随机数从1 - 100抛出,有些重复。

    def heap_or(A):
      n = len(A)
      for i in range(n):
        start = (len(A) - 2) / 2
        while start >= 0:
          siftDown(A, start, len(A) - 1)
          start -= 1:
             return 'True'
        else:
             return 'False'

    def siftDown(A, start, end):
    root = start
    while root * 2 + 1 <= end:
        number = root * 2 + 1
        if number + 1 <= end and A[number] < A[number + 1]:
            number += 1
        if number <= end and A[root] < A[number]:
            A[root], A[number] = A[number], A[root]
            root = number
        else:
            return

     print 
有人可以帮我一把吗?因为我不确定我是否正确定义了堆,代码也让我很难过!

1 个答案:

答案 0 :(得分:2)

堆属性(对于最大堆)是每个节点应该大于或等于其父节点。存储在数组中的二进制堆中的元素i的父元素是元素(i - 1) // 2

def is_heap(A):
    return all(A[i] >= A[(i - 1) // 2] for i in range(1, len(A)))

显然因为堆存储在数组中,我们不需要检查形状。