QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3009|回复: 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
    动画:面试官问我插入排序和冒泡排序哪个更牛逼?: c  @* r5 K$ z' L1 L7 x3 @
    - D! R5 K0 w, L7 X8 i
    写在前边
    $ E& r' r5 S- u; i6 a8 G  q$ T+ j. j5 H# G5 p

    ! e: ]6 C: f$ q( C& e; K排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。. p- G$ @, }6 Z: `

    $ \" K( M! x- e$ P虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。
    # P0 x& H$ M9 Z
    : B5 `. n# I) o9 u) l( P% V那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?3 R- T: l. Z5 m: x( I9 |  ^
    4 n& q+ s; u& W) g2 J3 v4 x
    思维导图$ O5 M) ]; U6 G  c+ m* W" n

    + }) z5 x2 K8 b% J0 n8 u' A
    / c+ ^( P9 W; L0 T, }% V1 P6 J
    : d# g5 B$ `, n5 P( K* E
    7 O2 f( C. P6 }& G4 n7 h( I. ^1
    4 ^0 I% R: H- i6 D0 C8 S1 f
    1 N% w' Y/ t. Z8 L' m% P% N1 [+ A9 y如何分析一个排序算法?
    ! _& N1 ?' R  C  l# O5 I4 U
    4 ~+ B4 \0 e4 h之前写的一篇很详细的文章。) {& y$ h( U2 r$ W2 ^9 w

    : ?+ ], H/ W6 g# h" p佩奇学编程 | 复杂度分析原来这么简单
    ! O) p# Z# B; a; {
    3 K; f! w3 W9 b! T* W; @- D分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。
    . P4 Q+ Z0 C) w
    ; f0 l% P. W( J  P& Z* w1.1 时间效率
    - Y8 |9 P! }9 ?, l/ K5 b" X  u6 I7 ^8 I1 A
    这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。
    5 \7 J% \' e; v! [* U# C4 g6 {7 f( v
    复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。
    - y8 a+ k% D: ?7 R: |
    ; K3 q7 V+ r3 n6 y, z. l对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。
    6 S, n. l$ _" ~* M6 o2 ?, t  l: y7 ^2 l
    1.2 空间消耗0 ?4 f5 X/ u2 @/ L- @% ?  r/ j! m

      c& q& [" v! O7 B所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。- K5 n9 E2 C# L' k& [
    ' v1 Z. d; {: |
    注意:是额外的内存空间,存储排序数据消耗的空间不计。" r; T: O1 d5 E/ R* u) e! \7 |
    9 F6 ?9 P% P6 ]' R5 O, w3 J
    1.3 稳定性3 ]. O6 j( J) d" P. ?
    8 L/ e& S% j5 Q1 B/ Q
    算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。
    2 B  B$ N- `$ L- X9 S7 V8 M7 G/ H( a; T* K' X+ J6 ~  V% ]! D
    2, l' N: i: `% m+ D5 g
    7 Z/ h* M( t& ?! n$ {" i
    什么是插入排序?
    9 E* U9 ~% t% R' h$ L+ K
    7 E% _8 G; x  w4 |顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。3 T, I& _4 Z$ y
    : w- V0 y) ]; ~8 b+ Z' |/ t
    . f7 j4 a1 x7 E# H8 F- w. P
    : l* T; a. |) B9 C7 m1 I- h
    3
    7 k6 Q  H& s( i4 E8 U: k# p+ \
      O* F  e* l0 Q0 c* `! [如何实现插入排序?6 y- [5 r6 N, ~' W* L% G2 A
    4 P/ @$ O+ b+ f& H2 g) C, N" O
    上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?* Y' h; ]& F- x& z

    & s: N& O. f) S! g6 v+ \0 _  X  T+ B/ M
    2 W9 l" }4 V8 t, w
    首先我们要将数据划分为两个区间,已排序区间和未排序区间。
    1 ^# _+ X( E. g1 E$ L
      g  b- q0 x, z, D* e
    1 w7 [5 s3 f* |, i: Q4 @3 a% e
    5 w  F  q1 ?; F( M, [' ^) D! v7 C0 u+ [& o. x4 t: n7 X
    ; R2 a$ z( ~7 i3 B# F
    我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。7 Y' w  [. S  t6 B8 k; Z8 G
    / [2 I: R9 }1 u! Y5 s! D8 T  T' L! O
    8 ?, B" W9 H% t  e: Y/ t
    5 l$ C3 x* \3 t

    ( F3 w: d* G+ ]& i. l8 e- p1 t4 |0 @6 f' H* R5 `6 f
    如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。3 ~) c4 G* I& P/ F6 v( N$ a, V

    9 ^, L! N3 h/ [$ A- D0 |
    # u) g8 ], ^% O  M" Y4 R3 r# X% x
    $ T" K5 S/ G; o, c
    4 v2 m/ i: ?. b$ A1 K$ z" s* c4 `7 l1 O" c( M/ [7 q
    最后我们看一下总的插入排序动画和代码实现。6 i4 Z; E2 j% A; [/ g
    . Q1 S0 ~& Q  L
    " }( C6 A4 w' v* A+ x) u2 @
    1 p/ c" `. L  z
    4. a8 t) J: `' W9 `; X/ i

    ' ^1 u# V6 T" m7 ]) w插入排序的性能/ j1 M/ a; k7 I% ~1 T* `3 u4 W8 m
    3 c# y; n1 H/ J8 l, I8 h/ X" h
    我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。
    % N8 {5 K, w0 Z, ~
    ( C2 |8 S3 L& b4.1 插入排序的稳定性
    & Y9 _$ Y  f7 x. ]: t( ^( T' d
    # ~& ^6 w) @; @  W% y/ K再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。
      q. ]$ V9 z" b+ ]  f& E) c, H1 J5 A3 F' L: m8 d: H
    4.2 插入排序的空间消耗
    8 G! T, |2 J6 [; L2 f, }, q- D; A) e3 o* H* O$ A3 r
    我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。: i) v: ~% I: z% w, \
    / d. n. N9 n3 [
    4.3 插入排序的时间效率
    5 y, f7 f& h) F2 Q" ~& i
    4 f* O) r$ {" |" A$ D, `插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。3 {& ]1 `7 V5 ?7 k3 h) J

    7 c! \. p+ s, r+ T1 l如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n2)。
    # Q) Q! {6 V  R. D
    5 u+ T& c6 P  s$ M对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n2)。7 o9 j3 o& v- G' R* d" `- q

    / ]5 P# P# g  m54 p% v+ A" A. v8 s) g
    5 e  E3 k0 p1 K% W
    小结7 y* [% G' ~: s  g

      Y) l) b/ r- {3 \5 V: I我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?/ n4 H$ ~7 z- W" b3 p
    : v; \* h/ ]% `0 F5 \
    我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。' k; g9 M+ y+ w" v9 ~) G( i7 b) A

    6 Y$ p8 Q& {1 p' _元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。
    / {. {% K6 f1 u! v# |$ A
    5 B! M2 @/ P+ G( h, y) `$ a) J$ J# f- U有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。
    8 v% e  T# ]6 `5 I# F5 s! b. {
    9 F* ?3 W( g7 _' ?5 Y虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。
    2 K  ]# d9 o& _0 m5 o/ I! s: M  a. F% u% y8 i" ]5 Y  O- r
    对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。; p% d* p0 w& v% |( q
    ————————————————
    * l, R2 \1 `! y) r  E; R0 p版权声明:本文为CSDN博主「胡鹏程的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。7 ~' r% e+ F4 {$ `
    原文链接:https://blog.csdn.net/lyshark_lyshark/article/details/126792708, I/ T( N/ k. p' k' a  e' d3 r5 C
    % p) v1 Y& V2 O8 B* G4 ?+ a5 i
    / s8 z+ G/ H$ H
    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-15 06:51 , Processed in 0.472146 second(s), 51 queries .

    回顶部