| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> 数据结构与算法-排序(2) -> 正文阅读 |
|
[数据结构与算法]数据结构与算法-排序(2) |
1.快速排序(原地排序)思路:取一个元素p(第一个元素),使p归位;列表被p分为两部分,左边都比p小,右边都比p大;递归完成排序。 关键代码:归位的实现。
时间复杂度:O(nlogn) 快速排序的问题:递归:递归最大深度;最坏情况:时间复杂度O(n^2) 修改最大深度代码:
2.推排序(原地排序)·堆:一种特殊的完全二叉树结构 ·大根堆:一个完全二叉树,满足任一节点都比其他孩子节点大,根节点为最大元素 ·小根堆:一个完全二叉树,满足任一节点都比其他孩子节点小,根节点为最小元素 ·堆的向下调整:假设节点的左右子树都是堆,但本身不是堆,通过向下调整根节点使其变成堆。 ·堆排序过程: (1)建立堆;(农村包围城市,从最下面开始调整,直到整个堆完成) (2)得到堆顶元素,为最大元素; (3)去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整重新使堆有序; (4)堆顶元素为第二大元素; (5)重复步骤(3),直到堆变空。 关键代码:向下调整和出数 向下调整代码:
时间复杂度:O(logn) 构造堆+出数:
堆排序时间复杂度:O(nlogn) 堆的内置模块:
堆排序-topk问题:现在有n个数,设计算法得到前k大的数(k<n) 解决方法: (1)排序后切片:O(nlogn) (2)简单排序三人组:O(kn) (3)堆排序:O(nlogk) 解决思路: (1)取列表前k个元素建立一个小根堆,堆顶就是目前第k个大的数; (2)依次向后遍历原列表,对于列表中的元素,如果小于堆顶,则忽略该元素;如果大于堆顶,则将堆顶更换为该元素,并且对堆进行一次调整; (3)遍历列表所有元素之后,倒序弹出堆顶。 代码实现:
3.归并排序(非原地排序)归并:假设现在有两个有序的列表,如何合并成一个有序的列表,这种操作称为一次归并。 思路:两个有序列表的开头分别有一个指针,比较两个指针所指位置值的大小,将小的先放到新的列表,另一个再放,直到其中一个列表变为空,将另外一个列表的剩余元素放到这个新列表中即可。 归并代码实现:
归并排序的思路:(递归) 分解:将列表越分越小,直至分成一个元素 终止条件:一个元素是有序的 合并:将两个有序列表归并,列表越来越大 ?代码实现:
时间复杂度:O(nlogn) 空间复杂度:O(n) 总结:(1)快速排序、堆排序、归并排序的时间复杂度都是O(nlogn); (2)一般情况下,就运行时间而言:快速排序<归并排序<堆排序; (3)三种排序算法缺点: ? ? ? ? 快速排序:极端情况下排序效率低 ? ? ? ? 归并排序:需要额外的内存开销 ? ? ? ? 堆排序:在快的排序算法中相对较慢 (4)递归有空间开销; (5)稳定的排序能保证相等元素的相对位置不变(相邻元素依次比较就是稳定排序)。 说明:本篇博客只是作为个人的听课笔记使用。具体课程为b站上清华大学博士讲解的数据结构与算法,课程讲的非常详细易懂,有需要的可以移步观看。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 22:29:25- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |