QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3004|回复: 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
    动画:面试官问我插入排序和冒泡排序哪个更牛逼?4 q' i( H* e+ B; I+ u

    6 D4 ^% T, W8 H4 Y" y写在前边
    ) R7 ]( R  d/ {$ W! R. b
    4 F! ^; a* ~4 z( ^8 s& J' s8 F& }; `! H
    排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。
    " G1 _, x) ]( {. t" D; H) j; k) C9 Q) |1 O
    虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。
    ! x7 Y9 P/ Q5 B- G0 b3 y7 }+ }+ L& f1 I5 a( l1 }
    那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?
    ) \% Y' E# C; C% b& |0 l0 a! k& [8 _$ a: u  r: `. h
    思维导图5 ?( L) s; _( Q' i, E' t3 Z0 B
    0 f! p" b/ f6 F  t1 s

    + a2 c% y- ~- b' N9 u: i1 F- c, x. p1 P: O* \$ |' M

    , y' Y3 O' c8 y# ~, o! g, ~1, ?) d( ]7 L. y: e: k  {5 c
    7 Z7 K) a/ e% R% s. F( i" k
    如何分析一个排序算法?
    ; G1 X% v6 s* S7 `  J9 P9 f5 \8 z- r5 p6 g
    之前写的一篇很详细的文章。
    9 _/ R' b  A/ P9 u( f- Z
    % X/ O% Z! M5 v' ~9 J佩奇学编程 | 复杂度分析原来这么简单& O5 Z% r6 P7 s" j# u
    9 w+ A* ?/ B3 `
    分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。
    ! v8 M' H- t# _# I  s, Q
    6 c- B0 l$ _0 A7 \) w1.1 时间效率; k: {+ X: ]& D
    $ B: Z5 t' l% }
    这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。
    # f, V) D) F" L/ ?. P# t; \. z8 G) g4 b7 j; U9 y5 E) k+ G% n
    复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。/ G5 ]& h9 Y7 ?& ~2 h3 c" @
    ( p0 P1 O# x. v' M/ i& J+ m
    对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。
    9 i$ K3 n& _* P5 u1 K1 k" {( o
    , ]- B5 `8 h1 E# i$ A/ z. O7 u2 l1.2 空间消耗- ~. |+ \7 m# `: _3 A: _6 b
    ! f9 }7 i% i) j$ R3 N# E3 R6 w/ q- k6 Z
    所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。4 b0 u# k3 }$ Z  a; D% U& o

    % y9 ~  v& {7 b& f* ^注意:是额外的内存空间,存储排序数据消耗的空间不计。' N+ s5 I9 _' ^/ W5 e

    & I1 `! S! F9 h1.3 稳定性
    # I5 C* p: {2 V( }4 p. f2 Z% z) O8 L! `9 s
    算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。
    ' E0 w+ b7 Z. }/ s6 r2 p8 K+ f4 b% v# o/ z, @# B
    2
    ; T/ f4 b/ N; V% k( N6 E4 C2 {# u
    + n' C) U: }& R' O什么是插入排序?8 Z: }; A1 a2 {/ p, r9 ^: [" A+ ~

    7 T1 m: F$ P' s. a% u( K顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。
    : z: l: h$ Y1 w1 o: o' i( h5 d+ s, P4 e7 @8 H& K* F3 Q
    ! L& ^* _' _* c0 w$ i

    & w( \" ~* t3 a; O3 x% v3+ p7 w3 x* q  J$ h1 p
    . {) E- P/ t+ t4 A0 ]# k% y7 W
    如何实现插入排序?' _. Z- J: o' j5 z+ x# T1 s

    . v4 S0 |3 V8 I( R上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?+ W3 l; N* i* p! n; V
    7 K1 C: l9 m: z; m' p# E

    / x9 H$ k' o% n0 l% S* s; ~9 w, v$ _) i
    首先我们要将数据划分为两个区间,已排序区间和未排序区间。1 v0 [0 s% L, `" @; @+ o/ q9 k
    & h0 ^. [5 U: q

    $ _3 q+ K; f2 p7 l( ]9 s4 Q2 b
      m6 I5 x, o$ N# B: `) N% g
    ( M4 b& _, r6 x* y5 s# i+ ^9 p8 c) i1 q0 b
    我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。
    4 Z& ^) t. n, L1 W- B2 X! G. v
    6 c: u. Z' Q6 z) c3 h- ^+ e- C7 R7 v* _  e2 s3 I2 c
    % [9 K9 m3 \0 z1 u% R
    # W0 j7 x6 u: M1 K" N/ k: ]0 a6 f& N
    9 \, x- L1 l% u# |
    如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。
    1 A- C9 I: U7 e5 J
    8 _- b. o% a# a: D. u8 e+ Y4 f- O8 E5 @7 \9 Q2 r3 s

    * N' b1 \! E7 O7 {. N* k! C, w+ f: _$ t$ N8 o

    & v4 c- H% T# t9 e9 U; ^2 T7 w0 V最后我们看一下总的插入排序动画和代码实现。2 k" I/ G1 S: u. L6 d2 X

    - v6 @9 Z3 o0 f' ^8 d0 u, M1 }4 O2 |; v& F$ x9 W! i$ ]" D
      B8 Y( Y" w, Q; J
    4- K9 }3 V/ ^/ ]* e7 `5 S4 N
    / \6 Z- L3 I0 f5 A! P+ Q2 ~
    插入排序的性能
    ! t& s5 A$ p; I" `4 x
    , F+ [5 e' Z1 x! o- V5 g! ]我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。! M7 C- s) f& O) u) G
    : k+ \4 k! x. S- A6 m0 i9 u
    4.1 插入排序的稳定性6 p( o4 ^9 W2 [- n; S, x$ M
    1 N* J+ t4 T. Z2 E
    再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。
    - a; ~/ W; b- B, L( o
    8 B% ~4 |' @: ?3 I4.2 插入排序的空间消耗
    4 F" u0 L9 {& _. f6 l- P2 s( N
    - b3 W8 B% R" k: ?- c; W; ^2 J我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。2 y" d% u1 u- h/ Z6 n" @/ D
    : T" v0 ?" J$ U- ]
    4.3 插入排序的时间效率! {# x$ k7 d9 i" U" K

    $ H/ u/ Z8 d9 A' R# S: W. T! m插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。. m8 `# Q% l* I2 Q5 b  g" N
    1 Q1 J- P3 e6 F
    如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n2)。
    + I" P: p0 w  X% R8 R# s# J9 O8 q! i! j( Y6 _/ J' a* \0 ~- y
    对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n2)。+ N5 Q' e6 _: a9 ~% m

    % k/ _# ^9 o0 H- ?55 v$ C+ [2 x4 r* T7 s: D- p" m
    2 ~, b* U: g$ V2 ?) X8 r
    小结7 o, x0 {2 B+ w1 @8 x. u" z  g
    1 }: b0 ^$ b2 q5 {  k& W7 o  {
    我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?
    0 S0 \) c, F3 c2 C6 E% S
    4 O. i$ M- K( K" K1 r# h我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。- l# n7 f4 c) l

    . D- v$ }* [, ?- m元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。
    8 r0 [  N8 M( ^' N9 R* a
    1 h, [7 A$ l9 Y5 g, [/ Z有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。
    + }- R" }, R) P  ]" o, F! r& Q1 U- U$ @' R- M9 r+ y. }% \
    虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。
    5 }+ ]7 ^) Z- n1 Z9 A8 }4 i" @  u# I* k" ^2 ~: v# f9 E5 I
    对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。
    ' J3 b! U: |* B$ A: i2 e0 `* n————————————————
    # @0 ]" E" I, y6 ^' ^; ]版权声明:本文为CSDN博主「胡鹏程的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。: V3 J6 U% H" Z4 d4 {$ z
    原文链接:https://blog.csdn.net/lyshark_lyshark/article/details/126792708
    " q( I, }! q0 N- Z5 h9 J* l" h$ j1 a+ n- Q
    1 |. B: q' O* d/ ^
    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-4-10 16:25 , Processed in 1.892710 second(s), 50 queries .

    回顶部