如何在Python中实现堆数据结构中的max_heapify

时间:2018-06-13 05:22:23

标签: python data-structures

以下是一类堆。我正在尝试对堆进行排序,但我的max_heapify函数存在问题。我插入了值[10, 9, 7, 6, 5, 4, 3],我的堆排序打印了给定的输出。给定的输出和预期输出在类

下面给出

堆类

class Heap(object):
    def __init__(self):
        self.A = []

    def insert(self, x):
        self.A.append(x)

    def Max(self):
        """
        returns the largest value in an array
        """
        return max(self.A)

    def extractMax(self):
        """
        returns and remove the largest value from an array
        """
        x = max(self.A)
        self.A.remove(x)
        self.max_heapify(0)
        return x;

    def parent(self, i):
        """
        returns the parent index
        """
        i+=1
        i = int(i/2)
        return i

    def left(self, i):
        """
        returns the index of left child
        """
        i = i+1
        i = 2*i
        return i

    def right(self, i):
        """
         returns the index of right child
        """
        i+=1;
        i = 2*i + 1
        return i

    def heap_size(self):
        """
         returns the size of heap
        """

        return len(self.A)

    def max_heapify(self, i):
        """
        heapify the array 
        """
        l = self.left(i)
        r = self.right(i)

        if(l < self.heap_size() and self.A[l] > self.A[i]):
            largest = l
        else:
            largest = i

        if(r < self.heap_size() and self.A[r] > self.A[largest]):
            largest = r


        if largest != i:

            temp = self.A[i]
            self.A[i] = self.A[largest]
            self.A[largest] = temp

            self.max_heapify(largest)


    def build_max_heap(self):

           n = len(self.A)
           n = int(n/2)
           for i in range(n, -1, -1):
               self.max_heapify(i)


    def heap_sort(self):
        """
         sorts the heap
        """

        while self.heap_size() > 0:

                self.build_max_heap()
                temp = self.A[0]
                n = len(self.A) - 1
                self.A[0] = self.A[n]
                self.A[n] = temp
                x = self.A.pop()
                print(x)
                self.max_heapify(0)




h = Heap()
h.insert(10)
h.insert(9)
h.insert(7)
h.insert(6)
h.insert(5)
h.insert(4)
h.insert(3)
h.heap_sort()    

给定输出

10
7
6
5
4
3
9

预期产出

10
9
7
6
5
4
3

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试使用left处的根构建最大堆。如果这是正确的,那么您的rightparentdef parent(self, i): """ returns the parent index """ i+=1 i = int(i/2) return i def left(self, i): """ returns the index of left child """ i = i+1 i = 2*i return i def right(self, i): """ returns the index of right child """ i+=1; i = 2*i + 1 return i 索引计算不正确。你有:

i=0

因此,如果i=3,则左边的孩子为2,右边的孩子为3.更糟糕的是,给定parentparent(right(i)) != i将返回2.所以你有这样的情况left = (2*i)+1 right = (2*i)+2 parent = (i-1)/2 。那永远不会起作用。

正确的计算是:

extractMax

我不知道您的max(self.A)呼叫A[0]的原因。您已经知道最大元素位于returnValue = save value at self.A[0] take last item in the array and place at self.A[0] decrease length of array maxHeapify(0) 。要提取最大项目,您需要做的就是:

heapSort

我使用伪代码,因为我对Python不太满意。

self.build_max_heap方法中的循环严重不合理。你在每次迭代时调用extractMax。你不需要这样做。如果while self.heap_size() > 0: temp = self.extractMax() print temp 工作正常,您只需要:

self.A

现在,如果要对数组进行就地排序,以便对<script> function myFunction() { var input, filter, table, tr, td, i; input = document.getElementById("myInput"); filter = input.value.toUpperCase(); table = document.getElementById("myTable"); tr = table.getElementsByTagName("tr"); for (i = 0; i < tr.length; i++) { td = tr[i].getElementsByTagName("td")[0]; td2 = tr[i].getElementsByTagName("td")[1]; if (td2 || td) { if (td2.innerHTML.toUpperCase().indexOf(filter) > -1 || td.innerHTML.toUpperCase().indexOf(filter) > -1) { tr[i].style.display = ""; } else { tr[i].style.display = "none"; } } } } </script> 本身进行排序,那就更棘手了。但它看起来并不像你想要做的那样。