首页 > 编程语言 > 详细

堆排序

时间:2015-03-23 22:09:46      阅读:309      评论:0      收藏:0      [点我收藏+]
#对于一个含有N个元素的基于堆的优先队列,插入元素操作只需要不超过(lg(N)+1)次比较,删除最大元素的操作不超过
#2lg(N)次比较。
class Dui:
    def __init__(self):
        self.pq = []#基于堆的完全二叉树
        self.N = 0#存储于pq[1,...N]中,pq[0]没有使用

    def __init__(self,num):
        self.pq = [0] * (num+1)
        self.N = 0

    def isEmpty(self):
        return self.N==0

    def size(self):
        return self.N

    def insert(self, v):#向堆中插入元素
        self.N = self.N + 1
        self.pq[self.N] = v
        k = self.N
        while k > 1 and self.pq[int(k/2)] < self.pq[k]:#元素上升
            self.pq[int(k/2)],self.pq[k] = self.pq[k], self.pq[int(k/2)]
            k = int(k/2)

    def delMax(self):
        maxNumber = self.pq[1]#从根节点得到最大元素
        self.pq[1],self.pq[self.N] = self.pq[self.N],self.pq[1]#将其和最后一个节点交换
        self.N = self.N - 1#堆的元素减少一个
        self.pq[self.N+1] = None#防止对象游离
        k = 1
        while 2*k <= self.N:#元素下沉
            j = 2*k
            if j<self.N and self.pq[j]<self.pq[j+1]:
                j = j + 1
            if self.pq[k] >= self.pq[j]:
                break
            self.pq[k],self.pq[j] = self.pq[j],self.pq[k]
            k = j
        return maxNumber

    def getElements(self):#获得堆结构的元素
        return self.pq[1:self.N+1]


堆排序

原文:http://my.oschina.net/stevenKelly/blog/390520

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!