堆排序

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
    	# 调整节点i,使其父亲节点的值大于儿子节点
        def heapify(nums, n, i):
        # 对于节点i而言,其儿子节点的索引值分别是 2 * i + 1 和 2 * i + 2
            if i >= n:
                return
            idx1 = 2 * i + 1
            idx2 = 2 * i + 2
        # 找到父亲节点和儿子节点中最大的节点的索引
            max_idx = i
            if idx1 < n and nums[idx1] > nums[max_idx]:
                max_idx = idx1
            if idx2 < n and nums[idx2] > nums[max_idx]:
                max_idx = idx2
        # 如果值最大的节点的索引不等于父亲节点,说明最大节点在儿子节点,交换值,然后递归创建
            if max_idx != i:
                nums[max_idx], nums[i] = nums[i], nums[max_idx]
                heapify(nums, n, max_idx)
        
        # 从最后一个节点的父亲节点开始调整,最后一个节点的索引值为n-1,则父亲节点的索引为 (last_node - 1) // 2。
        def build_heap(nums, n):
            last_node = n - 1
            parent = (last_node - 1) // 2
            for i in range(parent, -1, -1):
                heapify(nums, n, i)
        #主函数 创建
        def heap_sort(nums, n):
        #创建大根堆
            build_heap(nums, n)
        # 大根堆的最大的元素是nums[0],将最大元素和最后的一个元素置换,然后调整成堆,i是堆中的元素的个数
            for i in range(n-1, -1, -1):
                nums[i], nums[0] = nums[0], nums[i]
                heapify(nums, i, 0)
        n = len(nums)
        heap_sort(nums, n)
        return nums

一个堆排序的应用:
LC215 数组中的第K个最大元素

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        def heapify(nums, n, i):
            if i >= n:
                return
            idx1 = 2 * i + 1
            idx2 = 2 * i + 2
            max_idx = i
            if idx1 < n and nums[idx1] > nums[max_idx]:
                max_idx = idx1
            if idx2 < n and nums[idx2] > nums[max_idx]:
                max_idx = idx2
            if max_idx != i:
                nums[max_idx], nums[i] = nums[i], nums[max_idx]
                heapify(nums, n, max_idx)
        
        def build_heap(nums, n):
            last_node = n - 1
            parent = (last_node - 1) // 2
            for i in range(parent, -1, -1):
                heapify(nums, n, i)
        
        def heap_sort(nums, n, k):
            build_heap(nums, n)
            res = 0
            for i in range(n-1, n-k-1, -1):
                res = nums[0]
                nums[i], nums[0] = nums[0], nums[i]
                heapify(nums, i, 0)
            return res
        n = len(nums)
        return heap_sort(nums, n, k)
        
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值