每日python练习4---写一个大顶堆

方法1:

使用python自带heapq模块

import heapq
import random

randomlist = [random.randint(0, 100) for _ in range(10)]
#将randomlist所有数变负数,
newlist = [-x for x in randomlist]
#借助heapq,生成负数最小数的小顶堆
heapq.heapify(newlist)
#将负数的小顶堆取反,即是大顶堆
maxheaplist = [-x for x in newlist]
print(maxheaplist)

##方法2:
自己写函数,

class heap():
    
    def __init__(self, data=[]):
        self.data = data

    def add(self, e):
        idx = len(self.data)
        self.data.append(e)
        parent_idx = (idx - 1) // 2
        while parent_idx >= 0:
            if self.data[idx] > self.data[parent_idx]:
                self.data[parent_idx], self.data[idx] = self.data[idx], self.data[parent_idx]
                idx = parent_idx
                parent_idx = (idx - 1) // 2
            else:
                break

    def heapify(self, list):
        self.data = list
        n = len(self.data)
        for idx in reversed(range(n // 2)):  # reversed:返回一个反转的迭代器。
            #从n//2到0, 做大顶堆
            self._shiftDown(self.data, n, idx)

    def _shiftDown(self, arr, n, parent_idx):
        while 2 * parent_idx + 1 < n:
            biggest_idx = 2 * parent_idx + 1
            #比较左右子节点大小
            if biggest_idx + 1 < n and arr[biggest_idx + 1] > arr[biggest_idx]:
                biggest_idx += 1
            #比较子节点与父节点大小
            if arr[parent_idx] >= arr[biggest_idx]:
                break
            #若子节点较大,交换数值和位置;将子节点变成父节点,再次向下比较
            arr[parent_idx], arr[biggest_idx] = arr[biggest_idx], arr[parent_idx]
            parent_idx = biggest_idx

    def heapSort(self):
        n = len(self.data)
        self.heapify(self.data)

        for i in range(n - 1):
            #将最大数与最后一位数交换,用“n - i - 1”个数做大顶堆
            self.data[n - i - 1], self.data[0] = self.data[0], self.data[n - i - 1]

            self._shiftDown(self.data, n - i - 1, 0)

    def show(self):
        return self.data

import random

randomlist = [random.randint(0, 100) for _ in range(10)]

heap1 = heap()
heap1.heapify(randomlist)
heap1.add(random.randint(0, 100))
print(heap1.show()) #输出大顶堆
heap1.heapSort()
print(heap1.show()) #输出排序后数列
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值