再战排序算法
一.分治:将长数组一分为二,大的分成小的,再每个小的里面操作
1.快排(自我推荐),竟然敢取这么吊的名字,说明一定会有它的牛b之处
过程:先选择分割位,再进行分割,在选择分割位的时候,实际上就在排序了,当分割完成,排序即完成;从上到下一步到位
步骤:
1.左右边界判断,left<=right,retrun;
2.分割点定位,默认选第一个点(实际上选哪个点都可以,看起来就很灵活),while循环中,大于分割点的移到右边,小于分割点的移到左边,最后left=right就是要找的分割位
3.分割成左右子数组进入循环
2.归并
过程:先平均分割,再在两个子序列中合并排序,排序方式也很普通
步骤:
1.左右边界判断,如上
2.找中间点,分割进入左右子序列(递归)
3.两个子序列间的合并排序,排序后结果更新到原始序列
对比分析:nlgn
主观:快排单程,归并要往返,快排要快一点
客观:1.快排最好情况,分割lgn次,每次比较n次,无交换;最差情况,分割n次,每次比较n次 ,时间复杂度变为n2
2.归并排序,稳定,nlgn
二:插入
1.直接插入排序
过程:在有序的序列中,从后向前,一步一步找到合适的位置;先和最后一个位置比较,若小余它,则交换,再与前面的比较,直到交换至合适的位置;这里也可不进行交换操作,直接前面数据后移,找到合适空位插入
2.希尔排序(不稳定复杂度不确定):对直接插入排序的优化,将序列与处理为总体有序,减少操作步骤
过程:通过增量gap间隔抽取子序列,通过插入排序先排序,再逐步减小gap,直到处理完整序列
步骤:
1.取gap循环,每次循环gap减小,直至为1
2.循环内差值排序
三:基础
1.冒泡
2.交换
四:堆排序(自我推荐),时间和空间都很棒,依赖二叉树结构,调整序列顺序,先绑定,再联动
过程
1.构造堆,n取全集,i先选子节点,再通过循环选择父节点,i表示这个位置就是要放最大的值,i表示一个范围,以此节点为父的所有子树
2.使用构造好的堆,取出堆顶,放在排序队列中,再进入n-1堆的构造,这次的i取堆顶,重复构造取出堆顶放入队列中
构造堆步骤:通过给定数据,默认当前二叉树,通过变化节点位置实现堆排序
1.确定父节点i,也是作为最大值位置;左节点2*i-1,右节点2*i+1
2.三个节点判断,若父节点最大,直接退出;若左/右节点大,与父节点交互位置,并进入该子节点的判断排序,在构造堆的过程中,完成整体的排序效果;注意构造堆过程中,堆与数据同时变化位置
3.取堆顶,并与堆尾交换,因为整体有序,所以从堆顶开始判断,重新构造堆即可,异常情况已躲避
二叉树的分层与晋级与分治算法本质相同:分治更加形象,都是分了lgn层,最大值都是要从最低层,一层一层比较到最顶层,不同在于,前者平行比较,后者垂直比较,使用空间少,但前者优化一下,似乎也可以实现相同效果
五:非比较排序
1.计数排序,类似加密统计的方式
过程:
1.筛选数据范围,找出最大,最小值
2.开辟空间,计数存储,这是个遍历统计过程
3.数据还原,还原后的数据即排序后的数据
2.桶排序,分治思想,总体划分成多个桶,即范围,每个桶内再排序

浙公网安备 33010602011771号