QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3083|回复: 0
打印 上一主题 下一主题

[其他资源] 动画:面试官问我插入排序和冒泡排序哪个更牛逼?

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2022-9-13 12:30 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    动画:面试官问我插入排序和冒泡排序哪个更牛逼?
      m: q7 o* R1 V' L* ?  l- s# K( h) O: _& _( r
    写在前边
    * Z9 p- s( z$ ]( p2 h2 _$ U, M1 p( V3 [! I/ y

    0 {3 T4 @- t. ~5 Q: H排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。
    ( {! t: R- X4 ]  ?. Z0 D5 H* l1 I
    虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。
    2 s9 m' Z6 K* z! S$ c
    . n+ c/ h$ s; O那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?( {" y1 P1 G4 k% [7 _  @
    / k- j  Z' ~" V) T
    思维导图
    ! e$ t  ?/ [  c! c' a
    0 k* W7 C# K% g7 S6 z! ]
    % x3 g$ N; Y( {9 c" s5 |$ d9 }+ g3 d7 L" e& g

    ; ~/ @( m5 l% f1 ~' W) a2 `4 g1
    7 U2 J4 P* e% m
    ' K/ Q5 O" I' @9 k4 o如何分析一个排序算法?
    " V3 X  M: [- H. b0 D% z/ P/ [. x- y& v% f" c; G2 P
    之前写的一篇很详细的文章。# V0 ?6 |. m! N2 a8 |
    ) _$ l+ v/ t( P5 b3 ?2 c
    佩奇学编程 | 复杂度分析原来这么简单
    ; T# l, h2 T, R# D6 J7 a/ D
    % `5 s# ]( P$ [9 A4 m分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。  I7 `) `, }+ y; t4 n+ C0 W
    * |6 u5 a* R) M( P
    1.1 时间效率: A/ }9 a+ D' ]; ~* e8 t

    ; ~, H$ }, X4 F4 [. O这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。
    % h2 J+ h0 f' K! w4 u( x/ B
    & y! Z( n. X7 W7 x1 K复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。2 b/ q3 m9 V: L5 Z
      e1 A2 O7 ?4 h2 M+ q, S# ^
    对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。% r! W  C" |: I- p4 T' X
      F/ \3 S+ w1 a
    1.2 空间消耗
    , G% Z) o( m8 F- \+ P4 t( h7 b# ~( G: I. a- c: W7 ^6 ?7 I
    所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。6 K( E* |6 y0 V6 m  l/ @
    " c# Z& p, e# w* P1 U1 l! V
    注意:是额外的内存空间,存储排序数据消耗的空间不计。/ L; z8 U# M5 C& A5 n
    ; R+ L8 C4 b* T$ {. g
    1.3 稳定性
    2 t" ^3 g, v) o  q. A" f' F* [( G7 Q: e
    算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。: j: C  t. X- z

    8 }3 G$ x* V2 G2) s. v1 B, S% |9 }6 p, P" x
    * M6 r  g' b, K3 l
    什么是插入排序?
      {  q8 E) T8 g. O$ o- O
    % h2 l$ T& a: `% C+ N  Q( G; _  }顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。2 s0 Y, h# C1 O" @

    5 ?. ~1 o' T$ c3 [# q
    % i! T3 G# O7 H2 o6 R1 W8 d) Y* ?. ?2 L6 W0 i8 y# ~
    3
    & E% x. p, Q' V# a
    " N/ U; q" s" Z如何实现插入排序?4 c3 Z  j7 d, x+ j
    . P0 F; W; P, T5 i
    上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?
    9 s/ _% l! _$ \" \
    8 M# X2 e' ]5 T2 Q9 ?' r- |  ?2 U- G1 u/ X6 f

    $ o# m; l3 q0 U8 W' x/ m$ H* {8 d首先我们要将数据划分为两个区间,已排序区间和未排序区间。
    1 x/ Q# I1 W9 [* {/ r$ K
    * t  q, N. i) e; |) a; v, u6 N$ {8 o. l  j: `- n% z( L

    ) W( C9 Y: @0 ^" h$ y# {6 f! X$ r$ _' f/ u" Q8 {$ j5 K6 I

    ' ~2 }& Q' a! A我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。- N5 s! c/ T# ?( }5 V

    * ~0 ~6 q2 O7 L. S- y$ R8 d( q6 Z2 m+ N& Z

    ) R6 [( P3 e% V
    ) c$ {* E# r6 t7 J+ n% a$ Q' a' S0 J+ Z, e
    如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。  @0 ]& q5 e4 w% a$ X4 S3 L* \) V& J
    / K3 N1 ~6 y1 X% h* ^- C3 U
    : S" v% U5 o) F6 v2 Q- s
    : K6 R2 Q+ U. z. ^
    # p% w2 }6 |) W2 m

    , w; G& @! S% y- s( y  U5 V最后我们看一下总的插入排序动画和代码实现。
    / x2 b/ s! N$ Z6 z
    , M- @6 J9 Y! ?9 g
    ) n5 S5 \. n" I! W
    7 W# K5 J" \- C3 T4
    # }, x) L1 G2 J9 B2 P6 g% L! T/ J% Q
    插入排序的性能
    . v0 s5 v" a3 q$ W" v( l, ]
    - c* Q0 J- d3 q; a我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。
    1 {# T; q$ d! h
    ; W1 v3 J7 w: \: r( P! [4.1 插入排序的稳定性* ]$ W+ p- e5 v# r
    0 \. q% t, n+ W$ x0 A+ m
    再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。% \: D# |, t* x3 V" f  z/ u3 u2 C
    & ?( Q2 z3 ]& j# b5 w
    4.2 插入排序的空间消耗; j4 n- v& Q4 ~0 W

    , `! F! E1 D9 z% o. N. F* @3 B我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。
    ) ?6 Y" c3 B. T9 C. e
    % N) _3 K8 p* h4.3 插入排序的时间效率! h/ O" [) X8 i: U
    + ]+ a& @& s1 a3 |
    插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。4 f9 T$ O. E1 @2 z# t7 {) z- o3 M5 p

    ) b6 B4 M% Y9 ?  J) @% H如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n2)。- n8 t- ]2 K: q) u* o
    3 v' o% i" y* l1 C0 w
    对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n2)。! _1 ?  Y( r+ l6 @% w

    5 k& D7 _' \- R- @5
    9 x9 \. K4 x- P# |. d2 X& P$ C( x1 T: R2 t- b% v% y+ T* a3 z% \
    小结6 r7 v' u2 a5 g) {  y

    ) J' B# \, X3 ]+ |6 D" \! m% p4 g我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?: R/ o# u( l; O) ], ^' S
    ) ^, T2 D* }: l+ c8 E
    我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。
      \7 l0 s/ C3 E. A. M" H5 t: e& E1 @# u, Y1 T# e
    元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。3 F! c' p& Y& Y' z/ u- K+ T1 i
    6 W7 Y$ \4 a! w
    有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。1 t) F' q% {7 O
    " G. D& G! A+ d: T
    虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。3 l9 M5 F& m/ p4 b4 J1 F$ ?  o
    / S& m7 {% a- G' S( _* t" L4 |6 M: Z
    对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。$ m5 p+ J6 f6 U* @: a3 {& L" `
    ————————————————
    * p6 {3 q% k% A3 U+ m3 L2 z版权声明:本文为CSDN博主「胡鹏程的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。6 w2 v2 R7 l! A. Q9 H/ l
    原文链接:https://blog.csdn.net/lyshark_lyshark/article/details/126792708& E) b" ^, C! n: }

    1 d' L& S) ^. K
    . N/ x% O" s6 P5 H4 M, P
    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-9-13 04:45 , Processed in 0.458953 second(s), 51 queries .

    回顶部