QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3049|回复: 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& ?9 [& Z* v. ^  ]5 k$ @

    ! _0 T: w0 u* W) Z! D, u* W写在前边6 q$ e% `. d: ]1 K, k  h
    ! p. O6 h& a9 z- V
    - {( o" G5 }; J9 i/ E+ a; G, [, e. o
    排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。
    - _! }( {: U- i2 W
    - P) X8 q1 D! r3 y2 m5 Y8 f虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。
    1 r1 i+ W- @9 F
    2 y$ T+ ?. }5 c$ \4 P那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?% |  I2 z* u* Q) D

    / b: G/ ?5 i# B$ N6 E. z思维导图
    # B; \# T& G+ g+ E- z) I/ U) U' O: R; g7 Q$ S# i& S5 H/ Y! I! r
    0 g; k8 M$ H; n. l' q3 s5 Y
    7 S( c: A. i. ]7 Z+ K

    * h1 [1 z6 Y3 V; p; R1% L3 Z) z9 \1 w2 ~6 s5 S; I
    8 {! E4 x+ X( e0 ~0 y, P% }/ W
    如何分析一个排序算法?
    / F4 f6 k6 j8 ?% `; e. p; d9 i) k& p' r3 G2 y/ v
    之前写的一篇很详细的文章。
    3 [* L+ z! g6 m3 U' C1 b( }% A' C1 f# ~5 F! E4 @) \0 B
    佩奇学编程 | 复杂度分析原来这么简单" {1 y1 ^# i  O2 p

    6 Q& m4 h5 K3 H分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。
    / `% x- p( L- C% p% V& M/ u! t/ [! S4 e1 P- B- k
    1.1 时间效率, y7 `3 d; ]# W! M- t8 K
    ' V; S1 y: W: X2 \7 M( h
    这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。
    + u$ E- Q+ ]3 h& A8 F! M; {+ I/ x6 W* c$ T* X( p* O5 M0 l
    复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。3 K  \- E$ n/ x! k! \; h, ^
    9 L0 N5 I5 Z& a+ a$ Q
    对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。# W7 n0 ?# Y0 m! h( l' S* u3 R5 ~
    & R8 h5 I5 H! z
    1.2 空间消耗+ M3 z1 }5 E( ^/ F
    6 [% t8 u3 }! F3 w/ m
    所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。
    7 h: t6 W1 ?( D$ R1 x/ O0 D# N* P! m1 {. T
    注意:是额外的内存空间,存储排序数据消耗的空间不计。
    , I# N. Q8 o4 T$ c! h# X$ s+ h2 e4 O5 i7 }4 v/ l
    1.3 稳定性
      g; d: i! V9 N9 L2 B5 ~
    4 c0 `3 w* P! u% n& }算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。
    9 ^! g$ q2 a7 o# X+ ^
    6 F; d, n& W: b: w2' P1 e. h8 U/ n  b1 H
    2 m* g7 ]( G& l) e* x* g7 S' h
    什么是插入排序?& k2 x. |8 {! {- y: J
    ( y  J6 @; ^+ G) f- K- j
    顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。6 g7 o4 y. D, G" d7 L. `, b  D6 \( I
    - j) i0 \" E; U, H; L& s8 D

    + S) j! h+ P4 }8 K! {1 r
    $ d8 L% I* a5 H$ \0 x7 q& E3+ t* D9 f! u, \  n* p

    5 D' t9 B% m/ B2 ~* Q如何实现插入排序?0 t  m1 d, E' C. e$ L' g

    % p4 x  F+ k. k: T& U6 k! c上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?
    , [7 \  t: Q, r
    , A$ i1 ~0 m; X0 ^# N" K
    6 d" m& |1 L# k& y
    $ L; S0 l+ M% I% J  b6 W首先我们要将数据划分为两个区间,已排序区间和未排序区间。: X8 o$ f7 ]+ w- M
    / w' j2 W+ Q9 X1 Q. s; E& i- N

    & R8 c8 d6 [1 q8 s" f% y/ ?( r4 C& @2 C( O8 f
    9 |4 R) ]8 u! S, q2 k( S

    $ p* _( D* g( j1 Z, E+ H我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。/ C& y/ _3 K$ n! b

    7 w6 v% r, K. p5 n$ {$ Y  w
    1 v+ J2 I* q' Q: ]3 h+ f. g& M( I4 n3 M" m$ j. a( m8 P9 N; U
      N  v0 }  r4 }, h0 ]+ j3 H! [9 F  ~
    / z6 j  v+ I: V3 F! F! G% g" C
    如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。
    % C/ `9 e0 p) {% w0 ~
    ; Y% L7 {4 ]) b" ?$ A7 e/ ~5 l! F, b# d2 T% Z, w- W
    ; k( Q" A6 ?4 N- @2 P/ l
    & U) g! H7 |0 P3 K: [) _# h( p2 F4 J
    4 g  ^+ A* W1 ~* N- f
    最后我们看一下总的插入排序动画和代码实现。
    ( V3 S" d  e9 m; H) y( z6 k0 [6 v! a  r3 \8 Y, a

    ' G( H% t5 M% s4 T# b/ r
    ' _4 R2 {5 Y- d48 I" D5 Q# i& x& v; b+ H
    6 w/ ^- r0 t# V! D+ _
    插入排序的性能0 u' J8 m. {. a+ o% p7 d
    6 y0 U0 e" X: P( |4 q8 T' o, H1 @
    我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。4 x1 W/ q  g) ?

    ; D, a( h% H4 w4.1 插入排序的稳定性7 J3 _$ S$ u6 \! }3 f/ E9 m
    $ o# n$ d7 t; E' K4 g
    再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。) d: b9 i0 B: a4 [; B9 B; ~
    + j6 K: L, p2 N4 D
    4.2 插入排序的空间消耗$ v8 g, ?& q8 I0 J

    8 z7 }- k8 N/ K' _我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。
    / Y* R2 \( `8 s; W/ U
    . u) I0 W# l" m/ B+ M4.3 插入排序的时间效率
    : A! {, W4 u' g& j- p
    3 S0 F& \/ @, T: \$ Q: ]插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。
    $ @3 z9 }$ r( ^" p2 f$ G( a: d& v+ m: Z
    如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n2)。
    ' j  i. H- b# x  p( k5 O% E# R# n+ g6 h
    对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n2)。+ {8 H- i+ s( K3 g
    3 }" V; x+ [5 A
    5- D' _, S1 {# [) x3 e0 B3 m* Q+ r
    3 o- I. L# X( ?! Y/ l! I
    小结
    . V* u5 C0 R$ U7 f3 H+ t/ ], E% K9 o( y) T% i, Z* V) u
    我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?9 }- y. M$ z2 c" ]2 L, K$ `

    2 r/ [  t2 _, {; d: p" V2 {我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。
    % H$ z: h% m$ \2 Y% k+ D* b4 w- ^" b# S. |
    元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。9 P3 w( k! j6 D' r4 L  r3 x

    9 r: ?+ _3 h9 }  z有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。7 X- E1 ?) f  a2 M/ b) w9 P

    1 V6 G6 {& S5 ^虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。- E: l# K$ F7 n4 R. j1 N7 ~

    - [3 k" A7 H" V* Q' X7 j对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。
    " i4 c7 ]7 a; D6 ]( }————————————————
    0 I+ W* {  U; ~2 X8 P- ~# O1 @' f版权声明:本文为CSDN博主「胡鹏程的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    ) Y. @+ Z8 B! Y' T) B: B4 `原文链接:https://blog.csdn.net/lyshark_lyshark/article/details/126792708
    9 B  K3 F7 p/ t8 O0 ^$ C7 T9 E% J6 Q+ \. _% n' B9 J

    4 r& F$ T8 r+ D, R; v: ^1 C
    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-7-9 17:28 , Processed in 0.324242 second(s), 51 queries .

    回顶部