我正在尝试在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;这个部分不应该执行精益(一)。
答案 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]
是一个超过数组末尾的。