当前位置: 首页 > news >正文

算法笔记(二)—— 认识N(logN)的排序算法

递归行为的时间复杂度估算

 整个递归过程是一棵多叉树,递归过程相当于利用栈做了一次后序遍历。

对于master公式,T(N)表明母问题的规模为N,T(N/b)表明每次子问题的规模,a为调用次数,加号后面表明,除去调用之外,剩余语句的复杂度是多少,算出d。根据上次三个判断公式进行算法时间复杂度计算。

归并排序(递归实现)

求出中点位置,先将左边部分排好序,再将右侧部分排好序,再整合(双指针),使得整体有序。

时间复杂度O(NlogN) ;空间复杂度O(N)

小和问题

看某个数右侧有多少数比该数大,那么就有这么多个该数对最后结果造成贡献(使用归并排序,在归并过程中进行计算)。和传统merge相比,在于左组数等于右组数时,在小和问题中一定要先拷贝右组的数。

 

逆序对问题 

同小和问题,只不过换成了判断左数组的数大于右数组的数。


315. 计算右侧小于当前元素的个数 - 力扣(LeetCode)icon-default.png?t=N176https://leetcode.cn/problems/count-of-smaller-numbers-after-self/
 

快速排序

问题一:准备一个变量,表示小于等于区域的右边界,如果当前数小于等于num,则把当前数和区域下一个数做交换,区域往右扩一个位置,当前数跳下一个。若当前数大于num,那么跳下一个数即可。

问题二:和问题一类似,两个区域,一个为小于区域的右边界i,一个为大于区域的左边界j,两个变量。当前数小于num,当前数和i数交换,i++,当前数跳下一个。当前数等于num,直接跳下一个。当前数大于num,当前数和j数交换,j--,当前数不动。

那么快速排序,就是以数组内最后一个数作为num,重复上述问题二,最后将大于区域第一个数与最后一个数交换,递归进行即可。

时间复杂度O(N^2)

但如果选取num是随机的,选出来与最后一个数交换然后做划分,可以避免出现最坏情况。

时间复杂度O(NlogN)

http://www.lryc.cn/news/3655.html

相关文章:

  • 最长湍流子数组——滚动窗口,双指针,暴力求解
  • 45.在ROS中实现global planner(1)
  • Java中导入、导出Excel——HSSFWorkbook 使用
  • c#数据结构-列表
  • Sa-Token实现分布式登录鉴权(Redis集成 前后端分离)
  • leaflet显示高程
  • 电子学会2022年12月青少年软件编程(图形化)等级考试试卷(三级)答案解析
  • ubuntu 驱动更新后导致无法进入界面
  • 解决访问GitHub时出现的“您的连接不是私密连接”的问题!
  • 初识数据仓库
  • FilenameUtils工具类部分源码自研
  • 【前端领域】3D旋转超美相册(HTML+CSS)
  • Java——聊聊JUC中的原子变量类
  • elasticsearch索引与搜索初步
  • 【Python】多线程与多进程学习笔记
  • MySQL基础知识点
  • 代码随想录算法训练营第五十九天| 583. 两个字符串的删除操作、72. 编辑距离
  • 指针引用字符串问题(详解)
  • 数据结构——哈夫曼树编程,输入权值实现流程图代码
  • 【MySQL】 事务
  • Java测试——selenium常见操作(2)
  • 【三维点云】01-激光雷达原理与应用
  • 自动驾驶感知——物体检测与跟踪算法|4D毫米波雷达
  • C语言(内联函数(C99)和_Noreturn)
  • 图卷积神经网络(GCN)理解与tensorflow2.0 代码实现 附完整代码
  • 模电学习6. 常用的三极管放大电路
  • Lesson 6.6 多分类评估指标的 macro 和 weighted 过程 Lesson 6.7 GridSearchCV 的进阶使用方法
  • 基于 Python 实时图像获取及处理软件图像获取;图像处理;人脸识别设计 计算机毕设 附完整代码+论文 +报告
  • 前后端RSA互相加解密、加签验签、密钥对生成(Java)
  • 基于Java+SpringBoot+Vue前后端分离学生宿舍管理系统设计与实现