引子:
最近老东家要阵亡了,出来另谋生路。
大家有时会觉得数据结构工作中用不到,而且算法知识也很难全记住。
很多算法都是双层for循环,大概能记个样子,动手写基本是扑gai的。
虽说,是这样,像梦一场…但是掌握思想还是要的,不能像咸鱼一样(闷头搬砖)。
少年的志向是星辰大海。。。
TIPS:
lz也记不住,上学时就没学透,网上资料参差荇菜。最后翻出上学时的书(看纸质书还是很重要的),感觉有点门了。
要点:先把排序算法分类,分类很重要,就像知识梳理,理着理着就清晰了。
思想:是先看书->消化算法->自己组织语言敲出来,如果有理解偏差,大家回去对照着书看,也可留言(lz及时修正)。
PS:希望大家找到自己的有效学习记忆方法哈!!!lz这个分类是从上学的书上目录搬下来的,可能只适合用过这套书学习的,这里晒出来给大家参考。
PPS:记得高中一个物理NB老师经常说:领会精神!领会精神!给大家5分钟领会精神!!!
下边顺着排序算法的分类大家领会思想…
排序算法分类:
- 内部排序
- 插入排序
1). 直接插入排序
2). 折半插入排序
3). 希尔排序 - 交换排序
1). 冒泡排序
2). 快速排序 - 选择排序
1). 简单选择排序
2). 堆排序 - 归并排序
- 基数排序
- 插入排序
- 外部排序
- 置换选择排序
- 多路归并
1.插入排序——直接插入排序
思想:把n个待排序的序列看成一个有序表和一个无序表;开始有序表只有一个元素,无需表有n-1个元素;排序过程即每次从无需表中取出第一个元素,将它插入有序表中,使之成为新的有序表。重复n-1次完成整个排序过程。
2.插入排序——折半插入排序
思想:对直接插入排序的改进,原理同,区别在于:在有序表中寻找待排序元素的位置是,使用了折半/二分查找
折半查找只是减少了比较次数,但是元素的移动次数不变。折半插入排序平均时间复杂度为O(n^2);空间复杂度为O(1);是稳定的排序算法。
3.插入排序——希尔排序
思想:也是对直接插入排序的改进,本质上是一种分组插入排序。
没有交换,只有移位;分组对比移位直接插入
4.交换排序——冒泡排序
思想:从第二个数开始,依次比较交换两个数;第一次只能确定一个最大的元素(默认升序),每次只能确定一个数据的位置,n个数据需要n-1趟比较/交换。
5.交换排序——快速排序
思想:选取一个基数(默认第一个元素),跳跃式交换元素,使小于基数的元素都在左边大于基数的元素都在右边(默认升序);二分递归思想,至序列有序。
6.选择排序——简单选择排序(直接选择排序)
思想:第一次选择序列中最小的元素并取出,每次从剩下的序列中选择一个最小的元素取出;
对比“冒泡排序”,减少了很多交换操作,并未减少对比操作。
复杂度O(n^2)
7.选择排序——堆排序
思想:考虑简单选择排序,中间有很多对比操作,并未对排序起到实际的影响效率作用。如何使这么多对比操作,提高排序效率,这就是堆排序。
8.归并排序
思想:第一次把序列分为等量的两组子序列,然后继续递归进行子序列分组,知道分成子序列只有一个数据,进行递归回溯对比合并序列,最终完成排序。又叫二路归并排序。
======华丽分割线======以上8中排序均为以比较为基础的排序算法======
比较为基础的排序算,在时间效率上市有下界的。
结论:下届就是O(nlogn);
所以时间复杂度达到O(nlogn)的排序算法已经是理论上最优的比较排序算法了。
参考书中(a,b,c),三个元素的排序,可以建立一个比较二叉判定树。n个元素有n!中排列方式,可计算比较排序的效率下届O(logn!)≈O(nlogn)。
9.基数排序(新世界,新思想)
思想:不比较元素,而是根据元素的多个特征(多关键字)加入特征属性对比;比如扑克牌花色排序规则:♣<♦<♥<♠,元素数值排序规则:2<3<…A。这样可以根据花色先进性花色分堆,然后再根据元素数值进行排序。
种类:
1.高位优先法(MSDF)2.地位优先法(LSDF)
10种排序算法对比
算法 名称 | 比较 次数 ( 最 坏 、 平 均 、 最 坏 ) | 移动/交换次数(最好、最坏) | 辅助空间 | 稳定性 |
---|
排序算法 | 最好时间 | 平均时间 | 最坏时间 | 最好情形 | 最坏情形 | 辅助空间 | 稳定性 |
---|---|---|---|---|---|---|---|
直接插入排序 | O(n) | O(n^2) | O(n^2) | 0 | O(n^2) | O(1) | 稳定 |
折半插入排序 | O(nlogn) | - | - | 0 | O(n^2) | O(1) | 稳定 |
希尔插入排序 | - | O(n^1.3) | - | 0 | O(n^2) | O(1) | 不稳定 |
冒泡排序 | O(n) | O(n^2) | O(n^2) | 0 | O(n) | O(1) | 稳定 |
快速排序 | O(nlogn) | O(nlogn) | O(n^2) | O(nlogn) | - | O(logn) | 不稳定 |
简单选择排序 | O(n^2) | O(n^2) | O(n^2) | 0 | O(n^2) | O(1) | 不稳定 |
堆排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(logn) | O(n^2) | O(1) | 不稳定 |
归并排序 | O(nlogn) | O(nlogn) | O(nlogn) | O(nlogn) | - | O(n) | 稳定 |
基数排序(基于链式队列) | O(dn) | O(dn) | O(dn) | - | - | O(n) | 稳定 |
基数排序(基于顺序队列) | O(dn) | O(dn) | O(dn) | - | - | O(n) | 稳定 |
参考书籍:
《数据结构、算法及应用》张宪超