1.归并排序

merge合并

2.归并排序的扩展

–小和问题

任何一个数右边有多少个数比它大

归并排序比较之后就有序,

可直接通过下标计算的方式确定大小关系,

有序范围不断扩大,更加快速高效

–逆序对问题

左边数比右边数大构成逆序对

任何一个数右边有多少个数比它小

《笔试必出现》

3.优点:任何比较都会变成有序的部分

使O(N^2)变成O(N*log2 N)

4.递归形式变成非递归形式

最多变几回O(N*log2 N)

3.堆排序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N1LlWsiz-1656476490842)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_7835\Image.png)]

首先理解堆结构

—>某一个黑盒结构,用户要求提供两个方法

第一个add(num)添加数字到黑盒中

第二个popmax()返回int,把最大值返回并从黑盒中拿掉

用户要求该两个方法时间复杂度尽量低

堆,分为实际结构和脑海中结构,实际上是数组结构,脑海中是完全二叉树结构

完全二叉树是指::满足从左到右依次变满的过程,例如:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PAqaS00w-1656476490844)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_27645\Image.png)]

反例,(不是):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vu0ieLsJ-1656476490844)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_2152\Image.png)]

即:必须在每一层满足从左到右变满(这是脑海中的堆结构,而实际上是数组形式)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PNAJ6V3c-1656476490845)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_27167\Image.png)]

对应规则:任意一个位置i,左孩子2i+1,右孩子2i+2,父(i-1)/2.(注意:-1/2在计算机中是0)

(补充:默认完全二叉树都是从0开始的)

例如从1开始:左孩子2i,右孩子2i+1,父i/2.

往数据中不断填值即为二叉树在不断增长

堆分大根堆和小根堆,大根堆:头节点是最大值

例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1vl9gdrN-1656476490845)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_11731\Image.png)]

用户每输入一个i都和自己的父(i-1)/2比较,比父大即交换,保证每一步都是大根堆,在一个连续的范围内都是有序的,保证每加上一个数都是大根堆(heapinsert)

代码:

//arr[0...index-1]已经是大根堆了,某个数现在处在index位置上,往上继续移动
//arr[0...index]都是大根堆
public static void heapinsert(int[] arr,int index){//1   2
while(arr[index]>arr[(index-1)/2]){swap(arr,index,(index-1)/2);
index = (index-1)/2;
}
}

add()方法的时间复杂度是O(logN)

下面介绍popmax()方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Snx0IctM-1656476490846)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_24081\Image.png)]

找到最大值并返回,并把这个数删掉

大根堆的值就是最大值,令t=8保存最大值,通过有效区长度6找到最后一个数,填到0位置,把有效区长度改为5,然后从头部开始,做heapify 操作,找最大的孩子,和自己交换,不断向下直到没有孩子(超过有效区大小,即越不越界),此时整个结构依然是大根堆。heapify和popmax都是logN水平的。

解释:扩容一次要复制原数组,时间复杂度是O(N),总扩容次数是logN,总时间复杂度是logNO(N),所以平均单次扩容的时间复杂度是(logNO(N))/N,得logN(总添加次数是N,并非每次添加都扩容)

优先级序列的底层就是堆,

实际工程中不使用链表,因为无法使用公式,在数组中寻址很快,能迅速找到一个数的左孩子和右孩子。

//某个数再index位置,看看是否往下沉
//不断和左右两个孩子比较
//较大的孩子如果大于了当前的父,父节点往下沉,较大孩子上来
public static void heapify(int[] arr,int index,int heapSize){int left = index*2+1;//左孩子的下标
while(left<heaoSize){//下方还有孩子的时候
//两个孩子中,谁的值大,就把下标给largest
int largest = left +1<heapSize&&arr[left+1]>arr[left]
?left+1:left;
//父和比较大的孩子之间,谁的值大,把下标给largest
largest = arr[largest]>arr[index]?lardest:index;
if(largest==index){//最大值就是自己
break;
}
swap(arr,largest,index);//最大值不是自己则交换
index=largest;//index来到下方
left=index*2+1;//重新找孩子
}
}

堆排序举例:先使有效区=0,使整个数组变成大根堆

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6OwB5chx-1656476490846)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_21674\Image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Gun5BgsA-1656476490846)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_9735\Image.png)]

第一步目标达成。

现在有效区=5,

等同于做popmax()操作,尾和头交换,有效区-1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1zXsdAeO-1656476490848)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_2737\Image.png)]

然后从头节点做heapify操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bMhz2qNg-1656476490849)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_5838\Image.png)]

再把有效区-1,使4断联

再从0开始做heapify。。。一直到有效区减成0,排序完成

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-56jkZmZS-1656476490849)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_1299\Image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k8XUTgXV-1656476490850)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_23057\Image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6pAT5MEU-1656476490851)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_11852\Image.png)]

这就是堆排序。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dsmWTzqT-1656476490851)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_743\Image.png)]

估计总时间复杂度

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XEfisJlT-1656476490852)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_24370\Image.png)]

O(N)

总结:用户一股脑给全部数据比一步一步heapinsert要快

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KX4HPXVX-1656476490852)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_14274\Image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-09mXQEwW-1656476490852)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_30248\Image.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqypyZyx-1656476490853)(C:\Users\Ulrica\AppData\Local\Temp\chrome_drag24592_1676\Image.png)]

假设k=7,申请一个大小为8的小根堆,把数组的前8个数扔到小根堆里,然后弹出一个最小值,放在0位置,完毕。

牛客算法笔记【second week】相关推荐

  1. 牛客算法笔记 彩色宝石项链

    链接:https://www.nowcoder.com/questionTerminal/321bf2986bde4d799735dc9b493e0065 来源:牛客网有一条彩色宝石项链,是由很多种不 ...

  2. 牛客算法周周练2 B Music Problem(DP,抽屉原理,二进制拆分)

    链接:https://ac.nowcoder.com/acm/contest/5203/B 来源:牛客网 题目描述 Listening to the music is relax, but for o ...

  3. 牛客网笔记之数组(一)

    最近开始在"牛客网"上做题,希望通过日积月累,每天记录一点小知识,每天前进一小步. 今天练习的题目关于数组. 1. 数组存储:链式存储.顺序存储 线性表逻辑上是线性的,存储上可以是 ...

  4. 牛客算法周周练11 A.切题之路 签到题

    链接:https://ac.nowcoder.com/acm/contest/6046/A 来源:牛客网 题目描述 众所周知,SD省有一个可爱的妹子,叫做rqy(rqy天下第一可爱!不接受反驳,抱走r ...

  5. 牛客算法周周练11A - 切题之路(阅读理解)

    链接:https://ac.nowcoder.com/acm/contest/6046/A 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言6553 ...

  6. [牛客算法总结]:青蛙跳台阶

    标签: 递归.记忆化搜索.动态规划 题目: 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果). 数据范围:1 \leq n \l ...

  7. 牛客算法周周练8 「金」点石成金 暴力

    链接:https://ac.nowcoder.com/acm/contest/5803/B 来源:牛客网 题目描述 赛时提示:魔法值和财富值初始为0 帕秋莉掌握了一种金属性魔法 她决定去捡一些石头,施 ...

  8. 2020年牛客算法入门课练习赛1

    第k小数 链接:https://ac.nowcoder.com/acm/contest/12144/A 来源:牛客网 题目描述 给你一个长度为n的序列,求序列中第k小数的多少. 输入描述: 多组输入, ...

  9. 左程云牛客算法初级班笔记

    第一课 第二课 第三课 第四课 第五课 第六课 第七课 第八课 个人的上课笔记 记录了一些算法题细节的理解要点 第一课 估计递归大小复杂度的通式 a子过程样本量 b子过程发生了多少次 0: 除去子过程 ...

最新文章

  1. LinkedHashMap和HashMap的比较使用 详解
  2. 固态硬盘怎么看出厂日期_闲置的M.2固态硬盘怎么办?做个小巧便携高速的移动固态硬盘吧...
  3. 世界上第一位程序员是位美女——AdaLovelace【有图为证】
  4. 大话设计模式读书笔记2----单一职责原则(SRP)
  5. 【Java】Struts2配置默认Action和配置Action的默认处理类
  6. 还在为垃圾太难分类而烦恼么?AI算法来帮您!
  7. 操作索引库-创建索引库
  8. 使用 Daynamic 动态添加属性
  9. 前端开发面试题集锦(一)
  10. AcWing1074. 二叉苹果树(树形DP)题解
  11. 解决virtualbox 虚拟机不能ping通win7
  12. 【合金装备xp热门主题】
  13. 应用出海之--AdMob
  14. 工厂模式简介和应用场景
  15. 从西直门立交桥谈IT架构与重构(干货)
  16. 使用 styled-components 定义组件样式
  17. 日语中特殊汉字「髙」写入文件后乱码
  18. python游戏背景音乐循环播放_9.2 播放背景音乐_师傅带徒弟学:Python视频课程之游戏开发引擎Cocos2d-Python_Python视频-51CTO学院...
  19. 教教你如何配置汤姆猫 和 Java 环境变量的设置
  20. 系统的存储分离之----cifs文件管理系统

热门文章

  1. yum下载软件包报错 you could try using --skip-broken to work aroundthe problem you should tyr running: rpm
  2. 20190722华为OPPO小米夜间省电模式调研
  3. 《纽约时报》发文评选掀起区块链革命的10位代表性人物,吴忌寒上榜
  4. 软件需求工程 高校教学平台 培训计划
  5. python实现文档图像倾斜矫正,实现类似扫描仪功能
  6. matlab-K折交叉验证与分层K折交叉验证
  7. linux构建widi显示服务,如此简单 Intel WiDi无线高清设置教程
  8. 巴别塔合约终端开发日记1-----技术选择
  9. Flip Game(枚举)
  10. 再向子公司输血数十亿,这家巨头的汽车电子业务何时迎来拐点?