python堆的实现以及堆的排序

class Heap:

    def __init__(self, n):
        self.item = [None for i in range(0, n + 1)]
        self.N = 0
        self.MAX = n

    def _compare(self, i, j):
        return self.item[i] < self.item[j]

    def _exch(self, i, j):
        self.item[i], self.item[j] = self.item[j], self.item[i]

    def insert(self, value):
        # 往堆中插入
        if self.N == self.MAX:
            return -1
        self.N += 1
        self.item[self.N] = value
        self._swim(self.N)

    def _swim(self, n):
        # 堆的上浮
        if n == 1:
            return
        if self._compare(temp := int(n / 2), n):
            self._exch(temp, n)
        else:
            return
        self._swim(temp)

    def del_max(self):
        # 删除堆的最大节点
        self._exch(n := 1, self.N)
        self.item[self.N] = None
        self.N -= 1
        self._sink(2 * n, n)

    def _sink(self, n, temp):
        if n + 1 > self.N:
            return
        if self.item[n + 1] is None:
            if self._compare(temp, n):
                self._exch(temp, n)
            return

        if self._compare(n, n + 1):
            if self._compare(temp, n + 1):
                self._exch(temp, n := n + 1)
        else:
            if self._compare(temp, n):
                self._exch(temp, n)
        self._sink(2 * n, n)


class HeapSort(Heap):

    def __init__(self, item, n=0):
        super().__init__(n)
        self.item = item
        self.N = len(item)
        self.n = self.N - 1
        self._to_heap(int(self.N / 2))

    def _to_heap(self, n):
        # 将数组转换为堆
        if n == 0:
            return
        self._sink_(2 * n - 1, n - 1, self.N)
        self._to_heap(n - 1)

    def _sink_(self, n, temp, end):
        # 堆的下沉
        if n >= end:
            return
        if n + 1 == end:
            if self._compare(temp, n):
                self._exch(temp, n)
            return
        if self._compare(n, n + 1):
            if self._compare(temp, n + 1):
                self._exch(temp, n := n + 1)
        else:
            if self._compare(temp, n):
                self._exch(temp, n)
        self._sink_(2 * n + 1, n, end)

    def sort(self):
        # 堆的排序
        if self.n <= 0:
            self.n = self.N
            return
        self._exch(n := 0, self.n)
        self._sink_(2 * n + 1, n, self.n)
        self.n -= 1
        self.sort()


if __name__ == '__main__':
    # heap = Heap(10)
    # heap.insert(1)
    # heap.insert(3)
    # heap.insert(2)
    # heap.insert(6)
    # heap.insert(5)
    # heap.insert(9)
    # heap.insert(6)
    # heap.insert(5)
    #
    # heap.del_max()
    # heap.del_max()
    # heap.del_max()
    # heap.del_max()
    # heap.del_max()
    # heap.del_max()
    # heap.del_max()
    # heap.del_max()

    string = [5, 3, 1, 2, 7, 4, 6, 0, 9, 12, 123]
    heap = HeapSort(string)
    print(heap.item)
    heap.sort()
    print(heap.item)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值