排序算法汇总,堆排序,归并排序,冒泡排序,插入排序 - 详解

news/2025/10/1 17:22:52/文章来源:https://www.cnblogs.com/lxjshuju/p/19122583

215.数组中的第K个最大元素

1. 堆排序

复杂度分析:

  • 建堆过程时间复杂度为O(n),堆排序过程时间复杂度为O(nlogn)

实现思路:

  • 堆的排序过程实际上就是一颗完全二叉树,根据你输入的元素对该二叉树进行调整。以最小堆为例子,最终实现的效果就是越靠近根节点(上层节点)的其值越小,越靠近叶子节点(下层节点)的其值越大。
  • 如输入数组为[3,2,1,5,6,4]时,此时这个最小堆二叉树为

Code实现(使用python自带的堆进行实现)

import heapq
class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:queue = []for ele in nums:                ### 遍历过程:O(n)时间复杂度heapq.heappush(queue, ele)  ### 排序过程:O(nlogn)时间复杂度result = []for _ in range(len(queue)):min_ele = heapq.heappop(queue)result.append(min_ele)return result[-k]

2. 归并排序

复杂度分析:

  • 归并排序是在递归后序位置进行自底向上的排序,会有logn次的“并”,每次“并”的时间复杂度是O(n),所以整体时间复杂度为O(nlogn)

实现思路:

  • 先划分再合并,类似的题目参考23. 合并 K 个升序链表,也是采用归并排序的做法
  • 思路其实就是总-分-总,将大数组切割成小数组,当小数组长度为1时,此时就是最小数组单元。后续对两个最小数组单元进行排序,来得到一个稍微大点的有序数组,如此往复,就不断将多个有序数组进行合并后来得到整个的有序数组。

Code

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:result = self.merge_sort(nums)return result[-k]def merge_sort(self, nums):         ### 分割数组if len(nums) <= 1:return numsmiddle = len(nums) // 2nums_left = nums[:middle]nums_right = nums[middle:]left = self.merge_sort(nums_left)right = self.merge_sort(nums_right)return self.merge(left, right)      ## 左边和右边数组继续切割,切割完后进行merge操作def merge(self, nums_1, nums_2):    ### 合并数组merge = []i=j=0while i < len(nums_1) and j < len(nums_2):if nums_1[i] <= nums_2[j]:      ## nums_1 此时对比的元素更小merge.append(nums_1[i])i += 1else:                           ## nums_2 此时对比的元素更小merge.append(nums_2[j])j += 1if i < len(nums_1):merge.extend(nums_1[i:])if j < len(nums_2):merge.extend(nums_2[j:])return merge

3. 冒泡排序

复杂度分析:

  • 最坏情况时间复杂度:O(n²),即每一次遍历元素都需要进冒泡; 最好情况时间复杂度:O(n),即每一次遍历时不需要进行冒泡,但需要对每个元素都进行遍历操作。平均情况时间复杂度:O(n²)

实现思路:

  • 两个循环,一个循环对每个元素进行遍历。一个循环进行冒泡操作。
  • 冒泡操作需要当前元素与下一个元素进行对比,如果当前元素 > 下一个元素,则两个元素需要交换。(相邻元素的判断 + 是否需要交换)

为什么第二个循环是length - 1 - i,为什么是length - 1 ,因为是跟下一个元素进行比较,因此这里是为了确保 j + 1不越界。而为什么还要减去 i  是因为每次冒后,后面的元素已经确定了,因此后续在进行冒泡时可以不用再比较这些元素了。如下,第一轮冒泡后最后一个元素已经确定是最大了,因此下一轮冒泡时就不用与最后一个元素进行比较了。

Code

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:result = self.bubble_sort(nums)return result[-k]def bubble_sort(self, nums):if len(nums) <= 1:return numslength = len(nums)for i in range(length):             ### 确保每一个元素都经历了冒泡排序swapped = Falsefor j in range(length-1-i):     ### 对每一个元素进行冒泡排序if nums[j] > nums[j+1]:     ### 当前元素需要进行冒泡nums[j], nums[j+1] = nums[j+1], nums[j]swapped = True          ### 记录有没有经过冒泡,表示当前数组还没排序好if not swapped:                 ### 如果swapped为False,表明不再需要进行冒泡了,数组已经排序好了breakreturn nums

4. 插入排序

复杂度分析:

  • 时间复杂度上:
    • 最好情况:O(n) - 数组已经有序;最坏情况:O(n²) - 数组逆序,每次都要从头查找插入位置
    • 平均情况:O(n²)

实现思路:

  • 元素在插入到数组时,先与数组的最后一个元素对比,如果比这个元素大,那么就可以直接插入到数组的末尾处。
  • 如果没比最后一个元素大,那就要重头开始进行判断操作,判断从左到右,数组中哪个元素刚好大于这个插入值,那就将插入值插入到这个位置,原本这个位置和这个位置之后的元素都同步右移一位。

Code

class Solution:def findKthLargest(self, nums: List[int], k: int) -> int:result = self.quick_sort(nums)return result[-k]def quick_sort(self, nums):if len(nums) <= 1:return numsresult = []for i in range(len(nums)):if not result:result.append(nums[i])else:pre_val = result[-1]cur_val = nums[i]if cur_val >= pre_val:result.append(cur_val)else:left = 0while result[left] < cur_val:left += 1result.insert(left, cur_val)            ### 在result数组中的left下标添加cur_val这个元素return result

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

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

相关文章

AI元人文:于价值表征困境中试探

AI元人文:穿越价值表征的迷雾 ——于价值表征困境中试探 我们正站在一个历史性的门槛上。人工智能,这具硅基的“无限之器”,已从遥远的工具转变为近身的伙伴,开始叩问人类文明最核心的堡垒——我们的价值体系。然而…

住房建设建设部网站北京建筑工程公司大全

目录 表示多项式 多项式的计算 此示例说明如何在 MATLAB 中将多项式表示为向量以及根据相关点计算多项式。 表示多项式 MATLAB 将多项式表示为行向量&#xff0c;其中包含按降幂排序的系数。例如&#xff0c;三元素向量 p [p2 p1 p0]; 表示多项式&#xff1a; 创建一个向量…

解决ubuntu因自动挂起导致电脑卡死

说明:当电脑长时间未操作,或未关机合上盖子时会触发系统的自动挂起,导致系统卡死无法操作 解决方案 1.​​打开终端​​,输入sudo nano /etc/systemd/logind.conf 2.电脑重启即可

2025板材厂家 TOP 企业品牌推荐排行榜,环保 / 密度 / 净化 / 零醛添加 / 装修 / 生态板 / 指接板 / 直拼板 / PET 实木板材公司推荐!

在当下的建筑与家居装饰领域,板材作为基础且关键的材料,其品质优劣直接关乎到最终呈现效果与使用者的生活体验。随着消费者对居住环境要求的不断提升,对板材的环保性、耐用性、美观度等方面也提出了更严苛的标准。然…

delphi10.3下PDFium5.8安装与使用

delphi10.3下PDFium5.8安装与使用通过网盘分享的文件:Winsoft_PDFium_Component_Suite v5.8.zip链接: https://pan.baidu.com/s/12NSTe_qrZvRAGqt7Zhr0aw?pwd=cas4 提取码: cas4 D:\BaiduNetdiskDownload\Winsoft_PD…

2线性规划模型建模实战

线性规划模型建模实战(投资组合优化案例)笔记 一、案例背景与目标 1.1 投资场景设定市场存在 n种可投资资产Sᵢ(i=1,2,...,n),需用大额资金M进行一期投资; 资产核心参数(示例):资产Sᵢ 平均收益率rᵢ 风险损失…

网络技术:基本结构与协议

铺垫网络技术基本原理网络(Network)是 20 世纪的一个重要发明,其使得计算机可以互相连接,提供了无限的可能性。 概念 & 术语 有必要先理清一些概念。图自:https://blog.csdn.net/fiberroad/article/details/1…

Excel工作表自动追加工具项目总结报告 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

《电路基础》第三章学习笔记

《电路基础》第三章学习笔记任何伟大的事情都不是一蹴而就的,做任何伟大的事情都需要时间、耐心和毅力I’m back,完成到任务8了,回来继续学习电路! 这一章是本书中最为重要的一章,应给予足够的重视。 主要介绍:1…

移植Linux(No MMU)到ESP32-S3

主要原理是利用mini-rv32ima,在EPS32上运行一个riscv32模拟器,在模拟器里运行无需MMU版的主线Linux 6.X 这位大佬已经把mini-rv32ima移植到esp32-s3的PlatformIO里的Arduino平台上,代码看着好像很简单,就几个脚本:…

关于ws连接coinex偶尔会出现几分钟不更新数据的问题 - Charlie

一、环境 1、语言:go 二、服务概况三、现象 lark告警群中偶尔会出现coinex的btc和eth同时告警,但是他们的最后一次告警时间不相同,代码的告警逻辑是:每隔30s定时从数据库中查询redis中btc和eth的数据updateTime字段…

dz网站后台好的网页制作公司有哪些

智慧公安作为公安信息化开展到高级阶段的一种警务形态&#xff0c;“智慧公安”主要采用物联网、云计算、无线通讯、智能动态感知分析等新一代信息技术,将公安工作IT根底设备与物理设备、人际环境等高度交融,以提供智能化公安决策与效劳。智慧警务大数据云平台开发情报研判系统…

网站建设目标和功能介绍潍坊网站建设方案

华为北向网管NCE开发教程&#xff08;1&#xff09;闭坑选接口协议 华为北向网管NCE开发教程&#xff08;2&#xff09;REST接口开发 华为北向网管NCE开发教程&#xff08;3&#xff09;CORBA协议开发 本文一是记录自己开发华为北向网管遇到的坑&#xff0c;二是给需要的人&…

购物网站的前台功能网页设计教程书籍推荐

安装 VirtualBox 地址:https://www.virtualbox.org/wiki/Downloads 版本: 6.1和7.0+版本都可以 安装: windows上安装需要admin权限,右键菜单选中 “Run as administrator” 安装 CentOS 6.10 地址:https://vault.centos.org/6.10/isos/x86_64/ 版本: 如果不需要GUI,选择…

【C#】以 BlockingCollection 为核心的多相机 YOLO 检测任务处理框架 - 指南

【C#】以 BlockingCollection 为核心的多相机 YOLO 检测任务处理框架 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fami…

上手 cpp-httplib:轻量级 C++ HTTP 库的安装与实战指南 - 教程

上手 cpp-httplib:轻量级 C++ HTTP 库的安装与实战指南 - 教程2025-10-01 17:04 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !impo…

CAD安装Error 1402权限问题解决

问题描述 由于历史版本卸载不干净,在安装CAD过程中报错 1402,具体如下: Error 1402 Could not open key:UNKNOWN\Components\BCC6186334A64285641057ABAF4A6…Verify that you have sufficient access to that key,…

题解:P9868 [NOIP2023] 词典

原题传送门。 显然,如果我们想要把一个字符串字典序尽量小,我们把这个字符串中的字符从小到大排序就行了;反过来就是把字符串中的字符从大到小排序就行了。 我们可以暴力地对于每个字符串排序,然后对于每一个字符串…

304、渭城曲

304、渭城曲304、渭城曲 唐●王维 渭城朝雨浥轻尘,客舍青青柳色新。 劝君更尽一杯酒,西出阳关无故人。【现代诗意译】 清晨的渭城 下起了一场春雨 沾湿了路边的轻尘 旅店周围 青青柳条越发清新老朋友 再喝一杯饯别酒…

AtCoder Beginner Contest 425

AtCoder Beginner Contest 425 A ~ G 题解A,B H₂O题。 A 题直接模拟,记得 \(-1^x\) 的性质。 B 题构造题,每次往空格里填最小的可用数字即可。 C 这道题就相当于有一个数字圆环,每次求其中的一段区间的和。、 嗯?…