排序算法

PS:亦可移步BAT直通车获取更为详解的介绍

排序算法应该是我们最为熟悉的算法,从最基础的《数据结构与算法》到《算法导论》都有涉及。在笔试和面试中,基本上都会有所涉及,统计百度、阿里、腾讯的近三年的算法、研发的笔试题中都有对排序算法的考察。虽然实际工作中让你写基础排序算法的可能性较少,但对于笔试和面试,你都需要牢牢掌握排序算法的如下相关知识:

原理:必须清楚、简洁的回答原理相关问题;
复杂度:掌握每个算法的时间复杂度;
稳定性:要了解算法的稳定性问题;
最好情况:知道最好的情况复杂度是什么;
实现:能够书写代码实现;

关于原理和实现可以参考下面的详细介绍:

基础排序算法之快速排序法(一)

基础排序算法之快速排序法(二)

基础排序算法之快速排序法(三)

基础排序算法之TOPn算法

基础排序算法之基数排序法

基础排序算法之合并(归并)排序法

基础排序算法之合并(归并)排序——手摇法

基础排序算法之Bit排序(位排序)

基础排序算法之Shell 排序法 - 改良的插入排序

基础排序算法之Shaker 排序法 - 改良的气泡排序

基础排序算法之Heap排序法 - 改良的选择排序

排序基础算法之选择、插入、气泡排序

这里只做上面所罗列的算法的整体对比分析,帮助应试者全面掌握排序算法相关的知识。


稳定性

首先说一下什么是排序算法的稳定性。

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,ri=rj,且ri在rj之前,而在排序后的序列中,ri仍在rj之前,则称这种排序算法是稳定的;否则称为不稳定的。

对于不稳定的排序算法,只要举出一个实例,即可说明它的不稳定性;而对于稳定的排序算法,必须对算法进行分析从而得到稳定的特性。需要注意的是,排序算法是否为稳定的是由具体算法决定的,不稳定的算法在某种条件下可以变为稳定的算法,而稳定的算法在某种条件下也可以变为不稳定的算法。


复杂度

这里写图片描述

对于直接插入排序而言:

最好的情况,如果原来本身就是有序的,比较次数为n-1次时间复杂度为O(n)

最坏的情况,原来为逆序,比较次数为2+3+...+n=(n+2)(n-1)/2次,而记录的移动次数为i+1(i=1,2...n)=(n+4)(n-1)/2次,时间复杂度为O(n*n)

对于选择排序而言,其不关心表的初始次序:

最坏情况的排序时间与其最佳情况没多少区别,其比较次数都为 n(n-1)/2,交换次数最好的时候为0,最差的时候为n-1

对于冒泡排序:

最好的情况,n-1次比较,移动次数为0,时间复杂度为O(n)。

最坏的情况,n(n-1)/2次比较,等数量级的移动,时间复杂度为O(O^2)。

希尔排序初始序列对元素的比较次数有关。


排序算法整体分析

冒泡排序、插入排序、希尔排序以及快速排序对数据的有序性比较敏感,尤其是冒泡排序和插入排序;

选择排序不关心表的初始次序,它的最坏情况的排序时间与其最佳情况区别不大,其比较次数为 n(n-1)/2。

冒泡排序在最优情况下只需要经过n-1次比较即可得出结果(即对于完全正序的表),最坏情况下也要进行n(n-1)/2 次比较,与选择排序的比较次数相同,但数据交换的次数要多余选择排序,因为选择排序的数据交换次数顶多为 n-1,而冒泡排序最坏情况下的数据交换n(n-1)/2 。

插入排序在最好的情况下有最少的比较次数 ,但是它在元素移动方面效率非常低下,因为它只与毗邻的元素进行比较,效率比较低。

希尔排序实际上是预处理阶段优化后的插入排序,一般而言,在数据量比较大时,希尔排序要明显优于插入排序。

快速排序采用的分治的思想,用递归的方法,将原问题分解成若干规模较小但与原问题相似的子问题进行求解。快速算法的平均时间复杂度为O(nlogn) ,平均而言,快速排序是基于关键字比较的内部排序算法中速度最快者;但是由于快速排序采用的是递归的方法,因此当序列的长度比较大时,对系统栈占用会比较多。快速算法尤其适用于随机序列的排序。

因此,平均而言,对于一般的随机序列顺序表而言,上述几种排序算法性能从低到高的顺序大致为:冒泡排序、插入排序、选择排序、希尔排序、快速排序。但这个优劣顺序不是绝对的,在不同的情况下,甚至可能出现完全的性能逆转。

对于序列初始状态基本有正序,可选择对有序性较敏感的如插入排序、冒泡排序、选择排序等方法

对于序列长度 比较大的随机序列,应选择平均时间复杂度较小的快速排序方法。

各种排序算法都有各自的优缺点,适应于不同的应用环境,因此在选择一种排序算法解决实际问题之前,应当先分析实际问题的类型,再结合各算法的特点,选择一种合适的算法。


TIPS

这里需要特别说一下,这些常用算法都是常见算法,上述所列的算法中还有Bit排序算法,这个算法在笔试和面试中也会常用到,读者可以深入学习一下。

对于TopN算法这里所说并不多,但实际笔试和面试中,对于TopN算法的考察并不少,对于TopN算法面试者必须掌握。

对于归并排序,也是长考察的一个知识点之一,合并的时候,大部分算法实现都是新申请数组,所需空间较大,这里笔者撰写了如何使用手摇法来实现额外空间复杂度为O(1)。当内存空间有限的情况下可以考虑使用这种方法。

更多关于笔试、面试中的题目和知识的详解,可以移步BAT直通车,获取老司机的宝贵经验和总结。

PS:BAT直通车总结BAT和国内众多IT、互联网公司近年的笔试、面试题目,由BAT的老司机进行重点解析和知识点总结,同时老司机们会经常总结自身经验,帮助广大学生和初入职场的新手司机快速提升,欢迎关注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值