再战排序算法

一.分治:将长数组一分为二,大的分成小的,再每个小的里面操作

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.桶排序,分治思想,总体划分成多个桶,即范围,每个桶内再排序

 

posted @ 2025-05-31 14:55  江湖一支竹  阅读(7)  评论(0)    收藏  举报