数组中第K大的数 | 快速排序+堆排序两种解法 | Python实现

原题链接

. - 力扣(LeetCode)

思路

快速排序思路

快速排序中有一个partition函数,作用是以当前子数组的第一个元素为哨兵,将小于它的元素移到它之前,大于它的元素移到它之后,最后返回哨兵的位置。哨兵的位置不会再发生变动,是最后排好序的位置。哨兵的位置如果正好是len(nums)-k,则返回哨兵值。 如果哨兵的位置小len(nums)-k,那么哨兵右侧的子数组继续快排,反之,哨兵左侧的子数组进行快排。

堆排序思路

思路很简单,建立一个最小堆,弹出前len(nums)-k个元素,再弹出一次,得到的就是第k大的元素。堆排序这里我写了两种实现,一种是抄了捷径,用了python的heapq模块,代码十分简洁,但是时间效率并不高(虽然也通过了)。另一种是用数组模拟最小堆。

代码

快速排序代码

'''
归并排序解法
'''
from typing import Listclass Solution:def partition(self,nums: List[int],left:int,right:int) -> int:mid = left + (right-left)//2if (nums[left] <= nums[mid] <= nums[right]) or (nums[right] <= nums[mid] <= nums[left]):nums[left],nums[mid] = nums[mid],nums[left]elif (nums[left] <= nums[right] <= nums[mid]) or (nums[mid] <= nums[right] <= nums[left]):nums[left],nums[right] = nums[right],nums[left]i = leftj = rightwhile i < j:while nums[j] >= nums[left] and i < j:j -= 1while nums[i] <= nums[left] and i < j:i += 1nums[i],nums[j] = nums[j],nums[i]nums[i],nums[left] = nums[left],nums[i]return idef quick_sort_until_k(self,nums: List[int],left:int,right:int,k:int)->int:# print('left :',left,', right:',right)if left >= right:return nums[left]pivot = self.partition(nums,left,right)# print('pivot :',pivot)if pivot == k:return nums[pivot]elif pivot < k:return self.quick_sort_until_k(nums,pivot+1,right,k)else:return self.quick_sort_until_k(nums,left,pivot-1,k)def findKthLargest(self, nums: List[int], k: int) -> int:return self.quick_sort_until_k(nums,0,len(nums)-1,len(nums)-k)def main():solu = Solution()nums = [3,2,1,5,6,4]k = 2ans =  solu.findKthLargest(nums,k)print(ans)# print(*nums)if __name__ == '__main__':main()

堆排序代码(heapq)

'''
堆排序解法
'''
from typing import List
import heapqclass Solution:def findKthLargest(self, nums: List[int], k: int) -> int:heapq.heapify(nums)for i in range(len(nums)-k):heapq.heappop(nums)return heapq.heappop(nums)def main():solu = Solution()nums = [3,2,3,1,2,4,5,5,6]k = 4ans =  solu.findKthLargest(nums,k)print(ans)# print(*nums)if __name__ == '__main__':main()

堆排序代码(数组模拟最小堆)

'''
Input:
40 2 33 26 35 8 8 26 29 2
5
Answer:
26
'''
from typing import Listclass Solution:def down(self,heap:List[int],size:int,k:int):t = kif 2*k <= size and heap[2*k] < heap[t]:t = 2*kif 2*k+1 <= size and heap[2*k+1] < heap[t]:t = 2*k+1if t != k:heap[t],heap[k] = heap[k],heap[t]self.down(heap,size,t)def findKthLargest(self, nums: List[int], k: int) -> int:size = len(nums)heap = [0] + numsfor i in range(size//2,0,-1):self.down(heap,size,i)while size>k: # 最后堆中应该剩余的元素个数# print(heap[1],end=' ')heap[1] = heap[size]size -= 1self.down(heap,size,1)return heap[1]def main():s = Solution()a = [3,2,1,5,6,4]k = 2ans = s.findKthLargest(a,k)print(ans)if __name__ == "__main__":main()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/640153.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

设备运行远程监控系统

在信息化、智能化的浪潮下&#xff0c;设备运行远程监控系统已经成为企业提升运营效率、降低运营成本、保障生产安全的重要工具。HiWoo Cloud作为设备运行远程监控系统&#xff0c;以其卓越的性能和稳定的运行&#xff0c;赢得了众多企业的青睐。 一、设备运行远程监控系统的概…

VSCode 配置 C/C++ 环境

1 安装 VSCode 直接去官网(https://code.visualstudio.com/)下载并安装即可。 2 配置C/C编译环境 方案一 如果是在Windows&#xff0c;需要安装 MingW&#xff0c;可以去官网(https://sourceforge.net/projects/mingw-w64/)下载安装包。 注意安装路径不要出现中文。 打开 w…

01 【哈工大_操作系统】x86_64 常用寄存器大全

在学习CPU底层技术的时候&#xff0c;难免会接触到各式各样的寄存器。尤其是在使用汇编语言编写操作系统时&#xff0c;寄存器更是必不可少的。因此&#xff0c;这篇文章将来详细聊聊 x86_64 架构中的所有寄存器&#xff0c;按照从 常用->不常用 的顺序来进行介绍。 首先&a…

出海企业必备:Zoho Desk打造高效海外工单管理体系!

出海工单系统和常见的工单系统相比有什么不同呢&#xff1f;工单系统主要事帮助售前或者售后人员记录、处理、跟踪客户需求&#xff0c;不仅有利于企业内部管理的规范化&#xff0c;还能够有效提高客户服务质量。 工单系统可以帮助出海企业搭建统一的订单管理、售后服务、甚至…

轮转数组(Leedcode)的题目

题目&#xff1a;给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步…

sql(ctfhub)

一.整数型注入 输入1 输入2 输入2-1&#xff0c;回显为1的结果&#xff0c;说明是数字型&#xff0c;只有数字型才可加减 判断字段数为2 查询数据库 查表 查列 显示flag内容 二.字符型注入 输入1 输入2 输入2-1&#xff0c;说明为字符型&#xff0c;不是数字型 判断闭合方式为…

一款支持串口、网口自定义协议的调试软件

ComMax通讯调试软件是一款支持自定义串口&#xff0c;网口通讯协议的调试软件&#xff0c;用户可以根据需要&#xff0c;自定义协议包&#xff0c;然后根据接受的数据选择要发送的数据包。是一款强大、好用的调试软件。 点击下载 提取码&#xff1a;wmfg 不用安装 下载解压即…

纠正对CAN的错误认识

STM32CUBEMX系列——CAN通讯的配置_stm32cubemx 配置103 can-CSDN博客 STM32之CAN通信_stm32 can通信-CSDN博客 在回环模式下&#xff0c;发送的数据帧会在控制器内部被立即接收&#xff0c;而不会通过总线传播到其他节点。这种模式可以确保在没有其他节点干扰的情况下&#…

插值与重采样在AI去衣技术中的关键作用

在人工智能&#xff08;AI&#xff09;的众多应用中&#xff0c;去衣技术作为一种新兴的图像处理技术&#xff0c;逐渐引起了广泛关注。这项技术不仅涉及复杂的计算机视觉和深度学习算法&#xff0c;还需要对图像处理中的插值与重采样技术有深入的理解。本文将详细探讨插值与重…

MySQL基础之单表操作(定义DDL,增删改DML,查DQL)

目录 一、概述1.1 什么是数据库1.2 连接MySQL1.3 数据模型1.4 SQL语句的分类1.5 数据类型 二、数据库设计-DDL2.1 数据库层面2.2 数据表层面创建表约束查询修改add,modify,change,drop,rename删除 三、数据库操作-DML3.1 添加数据insert3.2 修改数据update3.3 删除数据delete 四…

Learn ComputeShader 02 Multiple kernels

前面已经成功创建了第一个compute shader&#xff0c;并且使用它替换掉quad的材质的纹理&#xff0c;现在我们将要在计算着色器中创建多个kernel。 首先调整上次的计算着色器&#xff0c;让它显示为红色。 然后再次创建一个kernel&#xff0c;显示为黄色。 结果应该是这样的…

10.Godot Input与自定义单例的使用

单例 单例是一个可以在任何一个脚本中对其进行直接访问的对象&#xff0c;分为内置单例与自定义单例。每个单例都是独一无二的对象。内置单例不是节点&#xff0c;主要成员是各类 Server&#xff0c;开发者可以使用它们直接控制游戏程序的图形与音效等内容。此外&#xff0c;还…