目录
一.插入排序
1.直接插入排序
特性:
1. 元素集合越接近有序,直接插入排序算法的时间效率越高
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1),它是一种稳定的排序算法
4. 稳定性:稳定
2.希尔排序
特性:
1. 希尔排序是对直接插入排序的优化。
2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。
3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些书中给出的希尔排序的时间复杂度都不固定4. 稳定性: 稳定
gap的取值:
1.shell提出: gap = gap / 2;
2.Knuth提出: gap = gap / 3 + 1;
二.选择排序
1.选择排序
特性:
1. 容易理解,但效率低。实际中很少使用
2. 时间复杂度:O(N^2)
3. 空间复杂度:O(1)
4. 稳定性:不稳定
2.堆排序
特性:
1. 堆排序使用堆来选数,效率就高了很多。
2. 时间复杂度:O(N*logN)
3. 空间复杂度:O(1)
4. 稳定性:不稳定
注意点:
1.排升序要建大堆,排降序建小堆。
2.可以用来解决TOP10问题,也就是排行榜问题。
3.堆的创建是从最后一个非叶子节点开始向下调整。
4.堆的删除是第一个节点向下调整。
5.堆的插入是最后一个节点向上调整。
三.交换排序
1.冒泡排序
特性:
1. 时间复杂度:O(N^2)
2. 空间复杂度:O(1)
3. 稳定性:稳定
2.快速排序
特性:
1. 时间复杂度:O(N*logN)
2. 空间复杂度:O(logN)
3. 稳定性:不稳定
注意点:
1.有三种快速排序的单趟排序
a.hoare法
两个指针分别从首尾开始,找小于目标值和大于目标值的进行交换。
b.挖坑法
与hoare法类似,不过是将某一方作为坑,最开始把key所在的位置作为坑。
c.前后指针法
初始的时候,prev指针指向序列开头,cur指向prev的下一个位置,cur查找到第一个大于(小于)key的值,然后和prev交换,prev++,此时开始,prev之前都是大于(小于)key的值了。
2.优化
1. 三数取中法选key(三数取中)
2. 递归到小的子区间时,可以考虑使用插入排序(小区间优化)
四.归并排序
1.归并排序
特性:
1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
2. 时间复杂度:O(N*logN)
3. 空间复杂度:O(N)
4. 稳定性:稳定
注意点:
1.辅助空间
主要用于处理两个有序数组合并成一个有序数组的问题(类似部分oj题目)。
2.应用
可使用在磁盘中,或是不同文件中的排序。
五.非比较排序
1.计数排序(哈希的变形应用)
特性:
1. 计数排序在数据范围集中时,效率很高,但是适用范围及场景有限。
2. 时间复杂度:O(MAX(N,范围))
3. 空间复杂度:O(范围)
4. 稳定性:稳定
注意点:
1.步骤
a.对数据进行hash统计
b.从最小(大)的元素开始根据hash统计的数据个数进行打印。
六.排序总结
排序方法 | 平均情况 | 最好情况 | 最坏情况 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|
冒泡排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
选择排序 | O(n^2) | O(n^2) | O(n^2) | O(1) | 不稳定 |
插入排序 | O(n^2) | O(n) | O(n^2) | O(1) | 稳定 |
希尔排序 | O(n*logn)~O(n^2) | O(n^1.3) | O(n^2) | O(1) | 不稳定 |
堆排序 | O(n*logn) | O(n*logn) | O(n*logn) | O(1) | 不稳定 |
归并排序 | O(n*logn) | O(n*logn) | O(n*logn) | O(n) | 稳定 |
快速排序 | O(n*logn) | O(n*logn) | O(n^2) | O(logn)~O(n) | 不稳定 |
七.结语
算法总结+个人认为的注意点。