排序算法学习笔记
最近打算将基础知识巩固一下,从基础的排序算法开始,网上很多排序算法的资料,我就不拿过来抄了,主要是说一下自己遇到的一些体会。
学习算法的时候,开始只是看一些炫酷的可视化排序图,但这个并不能帮助你的理解,因为没有细节,要想真正去理解算法,需要自己动手去写一个算法实践。
算法分为2部分:算法设计,算法实现。对于算法设计,就是搞清楚算法的思想,例如希尔排序,有分组和增量的概念,需要自己能够根据这个概念指导怎么将一个无序列的数排成有序,必须知道每个细节。对于算法实现,只不过是将算法设计去实现而已,如果在算法设计那个环节就没有做好,那么在算法实现环节肯定会花很多功夫。这个我就吃在调试快排的时候就吃了亏,在对快排还是很模糊的理解下就开始写代码,结果写的乱七八糟,花了整整一天时间在调试bug。
算法稳定性方面,以前没有概念,现在知道是在多个字段排序上有用。对于相同的值,在排序的时候不会调换顺序,就认为该算法是稳定的。
快排: 左右两个哨兵,分别从两边向中间出发,然后在遇到比基数大(小)的时候,交换位置。直到相等,左右重新设置基数,递归。
冒泡: 一直与相邻的做交换,直到最大的被换到最后。
选择: 类似于冒泡,但交换的次数比较少。
插入: 类似于打扑克抓拍,抓到一张就在手上有顺序的牌中插入。
希尔: 在插入排序上做的改进,与较远的元素交换,分组。
归并: 从中间将序列分成两半,递归,最后将左右的两个有序序列合并。
堆排序: 通过完全二叉树来构建排序。
学习建议方面,一定要去自己做一遍,看了别人写的再简单,也比不上自己做一遍。