python minheap

class heap:
    def __init__(self, arr):
        self.arr = arr[:]
        self.size = len(arr)
        for i in range(self.size/2-1,-1,-1):
            self.shift_down(i)

    def shift_down(self,i):
        flag = True
        while flag:
            left_child = i*2+1
            right_child = i*2+2

            if left_child < self.size:
                if self.arr[i] > self.arr[left_child]:
                    t = left_child
                else:
                    t = i

            if right_child < self.size:
                if self.arr[t] > self.arr[right_child]:
                    t = right_child

            if i != t:
                self.arr[i],self.arr[t] = self.arr[t],self.arr[i]
                i = t
            else:
                flag = False

    def shift_up(self,i):

        while True:
            parent = (i - 1) / 2
            if parent >= 0:
                if self.arr[i] < self.arr[parent]:
                    self.arr[i],self.arr[parent] = self.arr[parent],arr[i]
                    i = parent
            else:
                break

    def push(self,dat):
        self.arr.append(dat)
        self.shift_up(self.size)
        self.size += 1

    def pop(self):
        try:
            t = self.arr[0]
            self.arr[0] = self.arr[-1]
            self.size -= 1
            self.shift_down(0)
        except:
            raise
        return t

a = [50,60,2,4,5,77,56,90,12,43,45,76]
aa = heap(a)
print(aa.arr)
print(aa.pop())
print(aa.pop())
print(aa.pop())
print(aa.pop())
print(aa.pop())
print(aa.pop())
print(aa.pop())
print(aa.pop())
print(aa.pop())
print(aa.pop())
print(aa.pop())

https://blog.csdn.net/ahalei/article/details/30229451

猜你喜欢

转载自blog.csdn.net/he_wen_jie/article/details/81188419