排序算法整理
前言
排序算法作为一种很基础的算法,用途很广,也有很多种算法,那时间一长,就容易忘,所以就按照自己的记忆习惯,整理下常见的排序算法,加深印象,忘了也更容易捡起来。
快排
快速排序,经典!必须要记住!
名称:Quicksort,partition-exchange sort
不可使用的场景:pass
对哪些场景有优势:
时间复杂度:平均情况下时间复杂度为O(NlogN); 最坏情况下O(N^2)
空间复杂度:
算法流程简述:
- 选取一个待排数组中的一个元素的位置,可以称其为基点
- 基点的选取规则有很多种,一般分为默认选第一个,或者随机选择,这里使用随机选择
- 比较得出该基点应该所处的位置,然后将数组划分为两部分,一部分(其所有元素)小于基点的值,另一部分大于基点的值。
- 对划分出来的两部分进行递归的快速排序。
代码模版:
1 | import random |
堆排
堆排序,经典!必须记住!
不可使用的场景:pass
对哪些场景有优势:
- 在一堆数据中,选出前几个最大的或最重要的;或者反过来,选择最小的。这是因为堆排序所构建的树,根节点就是最大值或者最小值;
时间复杂度:O(NlogN) (数据长度为N)
空间复杂度:O(logN) (更新树的时候需要递归的对树遍历,其中所需要的栈的空间需要O(logN))
算法流程简述:
构建一个完全二叉树,并且
每个根节点都大于或者小于其子树中的节点
loop: 交换根节点和数组末尾的值,更新树,使其保持
每个根节点都大于或者小于其子树中的节点
直到树中只有一个节点终止。
代码模版:
1 | '''输入的数组按完全二叉树进行展开,堆排序就是将无序的树转成大根堆或者小根堆 |
经典问题:某一个数组,取前k个最小,最大,最接近等
这种问题可以用快排的思想(代码需要改改),也可以使用堆排序(几乎不用改)
参考资料
- 堆和树的区别 https://www.zhihu.com/question/36134980