创建二进制堆实现,给出错误的结果

时间:2017-05-11 08:53:15

标签: python heapsort binary-heap

我正在实施在线课程后的二进制堆,我已经完成了以下工作:

from __future__ import division

class BinaryHeap(object):
    def __init__(self, arr=None):
        self.heap = []

    def insert(self, item):
        self.heap.append(item)
        self.__swim(len(self.heap) - 1)

    def __swim(self, index):
        parent_index = (index - 1) // 2
        while index > 0 and self.heap[parent_index] < self.heap[index]:
            self.heap[parent_index], self.heap[index] = self.heap[index], self.heap[parent_index]
            index = parent_index

现在,我用它作为:

s = 'SORTEXAMPLE'
a = BinaryHeap()

for c in s:
    a.insert(c)

现在,在此之后,堆的排序为:

['S', 'T', 'X', 'P', 'L', 'R', 'A', 'M', 'O', 'E', 'E']

而不是

['X', 'T', 'S', 'P', 'L', 'R', 'A', 'M', 'O', 'E', 'E']

所以,似乎最后一次交流没有发生,我认为我可能搞砸了索引,但我找不到任何明显的问题。

1 个答案:

答案 0 :(得分:1)

好的,我明白了。当然,我无法在循环外缓存parent_index

代码应为:

def __swim(self, index):
    while index > 0 and self.heap[(index - 1) // 2] < self.heap[index]:
        self.heap[(index - 1) // 2], self.heap[index] = self.heap[index], self.heap[(index - 1) // 2]
        index = (index - 1) // 2

我感到惊讶的是,之前没有进入无限循环......