数据结构之常用排序算法

交换排序之冒泡排序
基本思想:两两比较相邻记录的关键字,如反序则交换,知道没有反序的记录为止.

略微改进的冒泡排序算法(Flag标记
时间复杂度:最好的情况就是本身有序,根据算法需n-1次比较,没有数据交换,时间复杂度为线性阶(O(n));最坏的情况就是本身逆序,时间复杂度为平方阶(O(n2)).总的时间复杂度为平方阶(O(n2))


交换排序之快速排序
基本思想:通过一趟排序将待排序的数据分割成独立的两部分,其中一部分的所有数据都比另一部分的的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个序列有序.
快速排序时间复杂度分析:快速排序的的时间性能取决于快速排序的递归深度,可以用递归树来描述递归算法的执行过程,平衡递归树性能比较好,最优情况下时间复杂度为线性阶 乘以 对数阶(O(n * logn));最坏的情况就是待排序的序列本身为正序或逆序,递归树成斜树,时间复杂度为平方阶(O(n2)).平均时间复杂度为线性阶 乘以 对数阶(O(n * logn))。不过快速排序的关键字的交换是跳跃进行的,因此快速排序是一种不稳定的排序算法.


快速排序仍有很多可优化的地方:
优化选取枢轴(key值)--三数取中、九数取中;
优化不必要的交换;
优化递归操作;
优化小数组时的排序方案;避免“大炮打蚊子”,数据很少时不如直接插入排序来的快;
------------------------------------------------------------------------------------------
选择排序之简单选择排序
基本思想:通过n-i次关键字间的比较,从n-i+1个关键字中选出关键字最小的记录,并和第i(1<= i <= n)个关键字交换.
时间复杂度也为平方阶(O(n2)),性能上略优于冒泡排序,交换和移动的次数相当的少.

选择排序之堆排序
简单选择排序中在后一趟的比较中,有许多比较在前面已经做过了,但是由于前一趟排序时未保存这些比较结果,所以后一趟排序时又重复执行了这些比较操作,因为记录的比较次数较多.
堆排序就是对简单选择排序的一种改进,做到每次在选择到最小记录的同时,并根据比较结果对其他的记录做出相应的调整.

堆是具有下列性质的完全二叉树:
每个节点的值都大于或等于其左右孩子节点的值,称为大顶堆;
每个节点的值都小于或等于其左右孩子节点的值,称为小顶堆.

堆排序基本思想:将待排序的序列构造成一个大顶堆,此时整个序列的最大值就是堆顶的根节点,将它移走(其实就是将其与堆数组的末尾元素进行交换,此时末尾元素就是最大值),然后将剩余的n-1个序列重新构造成一个堆,这样就能得到n个院中的次小值,如此反复执行.
主要解决两个问题:
如何有一个无序序列构建成一个堆?
如何在输出堆顶元素后,调整剩余的元素成为一个新的堆?

堆排序的时间复杂度分析:它的运行时间主要消耗在初始构建堆和在重建堆.
堆排序对原始记录的排序状态并不敏感,因此它无论好坏平均时间复杂度均为
线性阶 乘以 对数阶(O(n * logn)).由于记录的比较与交换是跳跃式的进行,因此堆排序也是一种不稳定的排序算法.另外,由于初始构建堆所需的比较次数较多,它并不适合待排序序列个数较少的情况.
------------------------------------------------------------------------------------------

插入排序之直接插入排序
基本思想:将一个记录插入到已经排好序的有序表中,从而得到一个新的、记录数增1的有序表.例子:一边摸牌,一边理牌.
时间复杂度最好的情况是本身有序,只需要做少量的插入操作,为线性阶(O(n);最坏的情况为本身逆序,时间复杂度为平方阶(O(n2))。总的时间复杂度为平方阶(O(n2)).

插入排序之希尔排序(shell排序)
直接插入排序在有些时候效率还是很高的,比如序列本身有序,只需要做少量的插入操作,还有就是记录较少的时候,直接插入的优势也很明显.不过这些条件都太苛刻.

基本思想:将原本有大量记录数的记录进行分组,分割成若干个子序列,此时每个子序列的待排序的记录就比较少了,然后再这些子序列内分别进行直接插入排序,当整个序列都基本有序时,再对全体进行一次直接插入排序.

分割策略:将相距某个“增量”的记录组成一个子序列,这样才能保证在子序列内分别进行直接插入排序后得到的结果是基本有序,而不是局部有序.至于“增量”如何选取,凭经验吧.

希尔排序的精华所在:它将关键字较小的记录,不是一步一步往前挪,而是跳跃式的往前移,从而使得每次完成一轮循环,整个序列就朝着有序坚实的迈进一步.
时间复杂度分析:取到合适的“增量”时,时间复杂度为3/2次方阶(O(n(3/2))).另外需注意的是增量序列的最后一个增量值必须为1.由于记录是跳跃式的移动,希尔排序是不稳定的排序算法.
------------------------------------------------------------------------------------------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值