二叉堆

2017-03-20  本文已影响0人  后现代主义蜗牛

二叉堆时一个我目前掌握的一个比较复杂(对我来说)的数据结构了。特地用python写了一个,虽然python提供现成的二叉堆这个数据结构,效率肯定时吊打我写的这个东东了,不过练习一些也是好事。

写二叉堆时自己犯的几个错误或需要注意的地方:

1.堆的开始是0还是1,导致后边数列的序号应该是count还是count+1还是count-1
2.堆的count变化应该写在什么位置,比如这里-shiftDown中的count=j这个命令我写在了if里边,导致有时候会出现死循环。
3.注意越界判断。

自己实现的一个二叉堆:
import random
class zuixiaodui:
    _count=0
    _capacity=0
    _data=[0]
    def __init__(self,capacity):
        self._capacity=capacity
        self._data=[0]*capacity

    def _shiftUp(self,count):
        if count<=self._count and count>0:
            while self._data[count]<self._data[count/2] :
                self._data[count],self._data[count/2]=self._data[count/2],self._data[count]
                count=count/2

    def _shiftDown(self,count):
        if count>0:
            while count*2 < self._count:
                j=count*2
                if j>self._count:
                    return
                elif self._data[j] > self._data[j+1] and j+1 < self._count:
                    j=j+1

                if self._data[count]>self._data[j]:
                    self._data[count],self._data[j]=self._data[j],self._data[count]
                count=j



    def insert(self,value):
        if self._count+1<self._capacity:
            self._count+=1
            self._data[self._count]=value
            self._shiftUp(self._count)
        else:
            print 'FULL'

    def extractMin(self):
        item=self._data[1]
        self._data[1]=self._data[self._count]
        self._data[self._count]=0
        self._count-=1
        self._shiftDown(1)
        return item

    def size(self):
        return self._count

    def isEmpty(self):
        return self._count==0
    def getItem(self,i):
        return  self._data[i]



if __name__ == '__main__':
    c=zuixiaodui(11)
    for i in range(10):
        c.insert(random.randint(1,10))
    print c.isEmpty(),c.size()

    for i in range(10):
        print c.extractMin()
上一篇 下一篇

猜你喜欢

热点阅读