本文从冒泡排序撩起,对选择、插入、希尔、归并、快排6种经典的数组排序进行了深入分析,并详解其间的关联,让你深刻理解其中的关键点;同时对经典的数据结构Vector、Stack、Queue、树、Map、Set做了归纳总结,对其底层的实现做了解析,分享给大家,作为每一个中高级程序员应该懂得的算法与排序,祝大家早上走上自己的“成金之路”。
目录:
1.排序算法
2.数据结构
3.资料参考
1.排序算法:
a.起源:
计算机从诞生起,就在模拟人这种智能生物的行为,而排序也来自于日常生活中,最经典的冒泡排序即来源于水泡从水底升上水面,离水面越近,水泡体积越大——由此诞生的冒泡排序思想即为:依次遍历每个元素,如果前一个比后一个大,则交换两者的位置。
其缺点有二:第一点每次比较都会产生交换元素的行为,效率低;第二点,算法复杂度为O(n^2)
b.针对缺点一的优化:
选择排序:即每次遍历只记录最大元素的下标,最后进行元素交换;
插入排序:当输入有序程度较高时,通过构建有序数组,并将新元素插入到有序数组中,完成整体的排序,降低元素交互的次数,缺点是不稳定;
希尔排序:插入排序稳定稳定程度太低,因此通过主动构建有序对(间隔n、n/2、n/4...1的有序对),来提升“插入排序”的稳定性,是插入排序的一种改进。
c.针对缺点二的优化:
归并排序:采用“分治算法思想”,将输入一分为二,分别排序,通过“并行”思想来提升算法效率,复杂度为O(nlgn),但是需要额外的arr[n]空间,来进行合并;
快速排序:对归并排序的改进,在不需要额外空间的情况下,对数组遍历,按对选定元素的比较进行划分,小的集中在左边,大的集中在右边;分别对两边进行排序——整体的思路与构建二叉树一致,其复杂度为O(nlgn)。
d.伪代码总结如下:
2.数据结构:
教学视频参考斯坦福公开课《抽象编程》,地址为http://open.163.com/special/opencourse/abstractions.html
这里对主要的数据结构进行了拆解,如下图
上图只是详解了其底层的结构,但是涉及到使用时,还需要提供一些常见接口,供调用者使用,如size()、iterator()/hasnext()/next()x、add()/remove()、contain()、isEmpty()等;见代码实现分享链接:http://pan.baidu.com/s/1hsoReNa 密码:h9q0。
另,附上《抽象编程》总结笔记,链接:http://pan.baidu.com/s/1jI6xZtc 密码:4ik0,希望大家对数据接口及常见的排序有个更深层次的认识,编程时不仅仅会用,还要体会其底层实现,以最高效的方式,来完成程序,走上自己的“成金之路”;另,转载请注明出处(百度搜“成金之路 博客园”)。请不吝“推荐”。
3.参考资料:
6个算法JAVA实现:http://www.cnblogs.com/uttu/archive/2013/02/07/2908793.html
MIT算法总结:http://www.cnblogs.com/uttu/category/451653.html