python heapsort实现

时间:2014-05-29 12:13:46

标签: python list heapsort

我正在尝试在Python中实现heapsort算法。 我得到错误:列表索引超出范围,但如果索引超出范围,则不应执行此部分代码。

def swaper(child,parent,a):

    temp = a[parent]
    a[parent]=a[child]
    a[child]=temp


def digswap(swap,a):

    '''
    swap here is the position of the former child, which was just swapped with 
    its parent. The concept is to check if the node that now contains the parent value
    has childs. If it has, then we might have to restore the heap property.
    '''

    if (2*swap)<=len(a):
            if a[2*swap]>a[swap]:
                    swaper(2*swap, swap, a)
                    digswap(2*swap,a)
    if (2*swap+1)<=len(a):
            if a[2*swap+1]>a[swap]:
                    swaper(2*swap+1, swap, a)
                    digswap(2*swap+1,a)

我得到&#34;列表索引超出范围值&#34; for&#34;如果[2 * swap]&gt; a [swap]&#34;。我不明白为什么,因为如果2 * swap&gt;这个部分不应该执行精益(一)。

2 个答案:

答案 0 :(得分:3)

列表为0索引。如果2*swap == len(a),则a中的最后一个有效索引为2*swap - 1,因此您的错误。

顺便说一句,你不需要swapper功能;你可以简单地写a[parent], a[child] = a[child], a[parent]。它效率更高,是一种常见的Python习语。

答案 1 :(得分:2)

数组索引从0开始。这会导致您访问数组的最后一个元素。

说你有a = [1,2,3,4]然后len(a)是4.这个数组的最后一个元素是a[3]。这意味着从以下行:

    if (2*swap)<=len(a):

你可以获得最多2的交换值,这意味着你基本上在做:

a[swap*2]
a[4]

是一个超过数组末尾的。