时间:2020-10-20 21:36:57
作者:whimouse
排序算法
稳定性:
指排序后原有数列中相同值的元素相对次序是否发生改变,若不改变,则是稳定的。
稳定性算法的好处:
若一个排序算法稳定,那么上一趟排序的结果往往可以被下一趟使用。
另外若是稳定,可以避免多余的比较或移动。
具体算法实现代码见数据结构类别
插入排序
1. 直接插入——快而简单的排序:
定义:
桶排序,也叫箱排序。知道待排序元素范围,需要在这个范围内的同样多的同然后把元素放进桶按序输出。
2. 希尔排序——直接插入的改进:
定义:也叫缩小增量排序
使用增量的方式改进插入排序,内部还是使用插入排序进行处理。
选择排序
1. 简单选择——简单:
定义:
可分为两部分,一部分是选择待排序中最小(或最小)的一个元素,与第一个元素进行交换,接着在剩余元素里寻找最小(或最大)的一个数,与第二个元素交换。一次类推,直到待排序数列中只有一个元素是为止。
2. 堆排序:
利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
交换排序
1. 冒泡排序:
定义:
重复走访待排序数列,一次走访两个元素。
原理:
用一个数组来存放待排序数列;
1.从尾部开始比较两个相邻元素,若尾部元素大则交换元素位置,
2.往前对每个相邻元素都做这样的比较、交换操作。这样到数组头部会产生最大的元素。
3.重新从尾部开始1,2操作,除了在之前已经排好的元素。
4.继续对越来越少的数据进行比较、交换,
2. 快速排序——最常用的排序:
通过一趟排序将待排序数列分成独立的两部分,一部分的所有数据比另一部分的所有数据都小,再按这种方法对这两部分数据分别进行快速排序。整个过程可以递归进行。
各个排序复杂度分析:
|
类别 |
排序方法 |
时间复杂度 |
空间复杂度 |
稳定性 |
||
|
平均 |
最好 |
最坏 |
辅助空间 |
|||
|
插入排序 |
直接插入 |
O(N^2) |
O(N) |
O(N^2) |
O(1) |
稳定 |
|
希尔排序 |
O(N^1.3) |
O(N) |
O(N^2) |
O(1) |
不稳定 |
|
|
选择排序 |
简单选择 |
O(N^2) |
O(N^2) |
O(N^2) |
O(1) |
不稳定 |
|
堆排序 |
O(NlogN) |
O(NlogN) |
O(NlogN) |
O(1) |
不稳定 |
|
|
交换排序 |
冒泡排序 |
O(N^2) |
O(N) |
O(N^2) |
O(1) |
稳定 |
|
快速排序 |
O(NlogN) |
O(NlogN) |
O(NlogN) |
O(logN) |
不稳定 |
|
借鉴文章:
1. 堆排序:详见:https://baike.baidu.com/item/堆排序
2. 数据结构学习书籍:《轻松学算法互联网算法面试宝典》作者:赵烨
稳定性:
指排序后原有数列中相同值的元素相对次序是否发生改变,若不改变,则是稳定的。
稳定性算法的好处:
若一个排序算法稳定,那么上一趟排序的结果往往可以被下一趟使用。
另外若是稳定,可以避免多余的比较或移动。
插入排序
1. 直接插入:
定义:
桶排序,也叫箱排序。知道待排序元素范围,需要在这个范围内的同样多的同然后把元素放进桶按序输出。
2. 希尔排序:
定义:也叫缩小增量排序
使用增量的方式改进插入排序,内部还是使用插入排序进行处理。
选择排序
1. 简单选择:
定义:
可分为两部分,一部分是选择待排序中最小(或最小)的一个元素,与第一个元素进行交换,接着在剩余元素里寻找最小(或最大)的一个数,与第二个元素交换。一次类推,直到待排序数列中只有一个元素是为止。
2. 堆排序:
利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
详见:https://baike.baidu.com/item/堆排序
交换排序
1. 冒泡排序:
定义:
重复走访待排序数列,一次走访两个元素。
原理:
用一个数组来存放待排序数列;
1.从尾部开始比较两个相邻元素,若尾部元素大则交换元素位置,
2.往前对每个相邻元素都做这样的比较、交换操作。这样到数组头部会产生最大的元素。
3.重新从尾部开始1,2操作,除了在之前已经排好的元素。
4.继续对越来越少的数据进行比较、交换,
2. 快速排序:
通过一趟排序将待排序数列分成独立的两部分,一部分的所有数据比另一部分的所有数据都小,再按这种方法对这两部分数据分别进行快速排序。整个过程可以递归进行。
|
类别 |
排序方法 |
时间复杂度 |
空间复杂度 |
稳定性 |
||
|
平均 |
最好 |
最坏 |
辅助空间 |
|||
|
插入排序 |
直接插入 |
O(N^2) |
O(N) |
O(N^2) |
O(1) |
稳定 |
|
希尔排序 |
O(N^1.3) |
O(N) |
O(N^2) |
O(1) |
不稳定 |
|
|
选择排序 |
简单选择 |
O(N^2) |
O(N^2) |
O(N^2) |
O(1) |
不稳定 |
|
堆排序 |
O(NlogN) |
O(NlogN) |
O(NlogN) |
O(1) |
不稳定 |
|
|
交换排序 |
冒泡排序 |
O(N^2) |
O(N) |
O(N^2) |
O(1) |
稳定 |
|
快速排序 |
O(NlogN) |
O(NlogN) |
O(NlogN) |
O(logN) |
不稳定 |
|
各个排序复杂度分析: