二叉堆

二叉堆时一个我目前掌握的一个比较复杂(对我来说)的数据结构了。特地用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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.什么是二叉堆 二叉堆是一种特殊的堆,二叉堆是完全二元树(二叉树)或者是近似完全二元树(二叉树)。二叉堆有两种:...
    RavenX阅读 2,255评论 0 3
  • 一、优先队列 1.简单介绍 优先队列是一种抽象的数据结构,它与我们生活中的许多场景息息相关。比如我们的电脑或者手机...
    丶legend阅读 953评论 0 0
  • 二叉堆 堆有序定义:当一颗二叉树的每个节点都大于等于它的两个子节点时, 被称为堆有序。二叉堆定义: 二叉堆是一组能...
    leoLy阅读 2,083评论 0 2
  • 我们有意调整了排序的顺序,最后讲这个堆排序。不是因为它很难,而是它涉及到了基本的数据结构知识。 堆,又名“优先队列...
    吃个小烧饼阅读 404评论 0 3
  • 介绍 在以往工作或者面试的时候常会碰到一个问题,如何实现海量TopN,就是在一个非常大的结果集里面快速找到最大的前...
    简单方式阅读 4,415评论 6 48