搜索算法(快排,堆排)

  1. 数组中的第K个最大元素
# class Solution:
#     def findKthLargest(self, nums: List[int], k: int) -> int:
#         if len(nums)<k:
#             return
#         low = 0
#         high = len(nums) - 1
#         self.quicksort(nums,low,high,k)
#         return nums[len(nums) - k]

#     def quicksort(self,nums,low,high,k):
#         index = self.partition(nums,low,high)
#         if index < len(nums) - k:
#             low = index + 1
#         elif index > len(nums) - k:
#             high = index - 1
#         else:
#             return
#         self.quicksort(nums,low,high,k)

#     def partition(self,nums,low,high):
#         povit = nums[low]

#         while low < high:
#             while low < high and nums[high] >= povit:
#                 high -= 1
            
#             nums[low] = nums[high]

#             while low < high and nums[low] < povit:
#                 low += 1
#             nums[high] = nums[low]
#         nums[low] = povit
#         return low

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        if len(nums)<k:
            return
        heapsize = len(nums)
        self.buildheap(nums,heapsize)
        for i in range(len(nums)-1,len(nums)-1-k,-1):
            nums[0],nums[i] = nums[i], nums[0]
            heapsize -= 1
            self.maxheapify(nums,heapsize,0)
        return nums[len(nums)-k]

    def buildheap(self,nums,heapsize):
        for i in range(heapsize//2,-1,-1):
            self.maxheapify(nums,heapsize,i)

    def maxheapify(self,nums,heapsize,i):
        left = i * 2
        right = i * 2 + 1
        largest = i
        if left < heapsize and nums[largest] < nums[left]:
            largest = left
            
        if right < heapsize and nums[largest] < nums[right]:
            largest = right

        if largest!=i:
            nums[largest], nums[i] = nums[i], nums[largest]
            self.maxheapify(nums,heapsize,largest)

快排与堆排的方法
时间复杂度O(n)
堆排序,建堆O(n),重建堆一次O(klogn),时间复杂度O(nlogn)
总结:这个之所以堆排是n个数的堆排,是因为在原数组上操作的,不费空间,如果像之前的频次,需要哈希表先统计的话,那么肯定是k个数的堆排

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值