排序算法总结

本文简单总结了常见排序算法,未详细讲解算法。介绍了插入排序、归并排序、堆排序、快速排序、计数排序、桶排序和基数排序,分析了各算法的时间复杂度、优缺点等。指出前四种算法通用性强,后三种算法条件苛刻但解特殊样例效果好。

简单总结一下排序算法。(不对算法进行详细讲解)

1.插入排序
插入排序是比较容易理解的一种排序算法,代码量不大,写起来十分简单,但是其效率较低。在此简单分析一下。
在最好的情况下,序列原本有序,插入排序即不用做任何操作,只需将序列遍历一边,时间复杂度为O(n),
在最坏情况下,要进行1+2+3+4+n次插入,时间复杂度为O(n2)。
在实际问题中,序列总是杂乱的,所以其平均时间复杂度是O(n2)。
(插入排序也还有许多优化方案,比如希尔排序,其可达到O(n1.3)。)

2.归并排序
归并排序用的是分治的思想,先对子序列排序,再对子序列合并(合并过程只需O(n)),反复递归实现。
不难得出其时间复杂度为O(nlogn),但是它需要额外的储存空间,子序列都需开辟额外的储存空间。

3.堆排序
堆排序应用到了二叉树的性质,将一个序列建成一颗完全二叉树,根节点大于(或小于)左右孩子,在此设计到建堆和堆的调整过程。
建堆过程并不复杂(在此不做解释),其时间复杂度为O(n)。
调整过程即堆弹出第一个根节点,对左右子树进行调整,使其又成为一个最大(最小)堆,此过程为O(logn)。
所以整个算法的时间复杂度为O(n+nlogn)。

4.快速排序
快速排序是目前最常用的排序方法,其在实际案例中是平均最优的,实现过程也并不复杂。
快排也是应用了分治的思想,先选定一个主元,进行一次遍历,将比其小的放在右边(左边),比其大的放在左边(右边),再递归的对左右子序列进行同样的操作。
在最坏的情况下,快排需对每一个元素进行反复调换,其时间复杂度为O(n2),但在实际生活中,快排的平均时间复杂度为O(nlogn)。

5.计数排序
计数排序对序列的要求比较苛刻,序列数值都落在一定范围内,比较集中,数据量比较大,就适合使用计数排序。
桶排序在时间上面优化很多,只需经行两次遍历,就能将一个序列整理完成,所以时间复杂度为O(n+k)。但是缺点是要开辟额外的空间,且局限性大,应用范围不广。(当k不大于n的常数倍时,计数排序时最有效的)。

6.桶排序
桶排序也是运用到了分治的思想,将数据分为几块,再分开进行排序,要求数据均匀分布,和计数排序有点类似。
当数据比较均匀时,桶排序中每个桶中数据量是差不多的,这样就可以优化排序效果,其时间复杂度也是线性的,即O(n)。

7.基数排序
基数排序是多关键字排序的一种,分为主位优先和次位优先算法,其实质是一样的,这个算法比起前面两个线性算法来说条件没那么苛刻。但是他也有他的缺点,耗费大量内存空间,其排序过程中需开辟大量的额外空间,且其算法也没有前两种那么快,在每个位数(个位、十位、百位…)上进行一次遍历排序,但其总体时间复杂度还是线性的即O(n)。

总结:插入排序、归并排序、堆排序、快速排序的算法是通用的,对于任何样例,其通用性不变。
但对于计数排序、桶排序、基数排序来说,其条件苛刻,但算法简洁,快速,对于解特殊的样例有十分超群的效果。
(在看到题目时优先考虑三种线性算法)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值