QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3120|回复: 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
    动画:面试官问我插入排序和冒泡排序哪个更牛逼?
    / G+ Y8 D- p" V! n8 R  N5 B- i! F8 u% g8 {* x
    写在前边
    3 z1 K' n! m& y3 a; ~
      S# S, v/ _2 F& F# k! C! ^
    ; _; B$ b/ ?& b排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。' Y& d, c4 ]  s4 e/ u( j' M, H2 I$ k
    1 A1 y6 E5 V, c' {! Z: Y; t
    虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。
    ; {" Y5 ?1 P6 X; ?6 k+ ?' F( ?* p' \5 E0 ^1 V) T5 Z0 ~( V
    那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?
    " y( q0 m  D7 }; c+ \5 `5 p% b/ Y  E5 u) }
    思维导图& m2 j5 q/ O& D! r0 R: \

    4 d. A: Q: O! o2 q* Z0 b  p1 L  ^( p# O$ _7 U) v9 S

    / k# c& P3 l, f& c: L7 j: r2 C
    " {0 R% Y# E5 g/ X6 l3 ~% c16 U$ c) D' N; F* _' p# G8 h
    3 k5 |; O6 W& h5 C6 K
    如何分析一个排序算法?
    & m7 i! _8 r/ U7 g- m: u) h9 N. p/ X/ o. ?! }
    之前写的一篇很详细的文章。
    + _2 l) F4 ^/ k
    # o2 Y5 y, A3 }4 O$ v佩奇学编程 | 复杂度分析原来这么简单* o4 B# @3 x, `- P3 X$ F. b

    * F# U6 F, Q3 J! m) W! i分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。
    % z& D9 P* a5 t' Q$ L2 N! i" `$ p* G
    1.1 时间效率
    : @/ {, n6 a- z7 I. ~/ F0 Y* o& O6 h, Y2 l6 l; T. k* j
    这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。
    % J8 c/ f: n7 J$ r+ Q
    , H/ M" i7 N* {$ K/ D: X$ j复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。
    . v+ v4 h5 f% f1 L3 _  U: x+ X7 h% H, D$ q9 [! o& O. B4 P
    对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。
    % H& p  @7 x1 q  }0 N  C8 S4 v
    1 ^6 E+ y9 ~0 K1 U8 v! d, k' z2 P1.2 空间消耗/ {! g2 `  x3 j% U, x* _

    ) b7 i1 L  x" V* }, H- |所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。
    4 W; N7 [: l: r+ Z" m1 `
    . H& k& D2 O# o- J! y' ?/ R注意:是额外的内存空间,存储排序数据消耗的空间不计。
    + S6 T# j* T9 |" y0 _. G
    - M6 m" O  i5 t1.3 稳定性2 x' c0 v, p* |; d* q

    ) B! q# E, B# @5 [( e. T' j算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。# S3 q- }! }) [" _+ m

    ) ]! a. I7 o+ c( k21 V( x- }# ]3 _# c, `0 ^
    2 d  u6 A- L4 ]  Y1 q
    什么是插入排序?3 x" r6 }0 @# z+ Y9 |+ }1 p/ ^" {

    " a3 ^5 o' ^) O, T, I; [+ ?顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。
    ' A0 k  ?2 [$ ?1 h+ C) a/ c' k! `/ e* h
    " V4 @8 M; u3 a' G  q/ P
    # h* |1 J2 z: w
    38 l# o! ]/ S7 f9 K  [4 [

    & _) ]2 V: L3 f9 @, G5 P7 L如何实现插入排序?
    ! t8 y- u4 i, L/ x% M0 j  @, u% I0 V2 m* R- B6 T
    上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?
    ; |7 B- s& S9 p3 [" ?" u: F8 ~8 D; ^

    ( W9 c( P+ b: y- e% y; A5 e5 t- t6 z/ v" G9 b
    首先我们要将数据划分为两个区间,已排序区间和未排序区间。
    ( U: N; H: D3 \% d) u9 c$ C1 d' [+ B, n% n+ K
    7 L2 _& Z* d( @$ t

    5 Y1 V& _+ A* f" ~% y9 Q
    : m7 \4 `) U% @9 I# h! t( `" J
    / t9 w3 m4 ]" J# Q( W我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。- }4 G2 z2 [9 l' Y( x2 Q( |/ Y
    # {: {- r8 O0 _  E" p6 w& z1 D
    ' @  k: Y! T! t" g* ^
    2 K. T& h0 ^7 F( ~2 f) I
    : F: z, u& Z+ c/ H7 N

    6 K( ]$ H1 N5 v5 C% Y0 C+ @+ Z如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。% j! g, m! V" E: F- y  s0 K
    " x0 |* M$ X8 R* B
    7 o$ t9 I8 F; I6 S+ }
    8 i" E( W- J6 ^

    , k* s6 d1 D* ^; ?# ^! D, C; ^5 ]+ T& g2 G+ ^* y; W* o
    最后我们看一下总的插入排序动画和代码实现。
    0 j3 u& C. E6 r) @( g+ ~6 q# ^: y
    2 |3 n- n2 V4 [) p+ N9 O
      \4 y: {' E" _/ r8 t% q& q+ D8 m/ a  _8 J+ k8 u
    4( G4 K8 c+ a2 S
    9 ^! v' w3 a3 z6 o
    插入排序的性能7 _! e: @( P! C% F& H) a4 u/ I" Z
    7 a7 M8 P% o8 e. e5 r' x7 H" d
    我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。
    8 r- q, X& G3 q6 ~2 h
    6 R) a8 E0 [5 o9 V1 @+ y, s4.1 插入排序的稳定性: Y, Q0 e; ~, k! F2 g( y7 @
    " |% ~- Y$ X* d, p/ L! \
    再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。5 _8 D) ]9 L& b+ J7 Y& x2 \, t( Y
    + z" `2 I/ W: l7 r& y
    4.2 插入排序的空间消耗
    * f! y! j& b# E0 J
    " q7 Q* ]( S/ {( i我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。
    : N( F! Q* u) k
    - Y. _+ u. G. c- Z3 V; N9 G4.3 插入排序的时间效率
    $ T/ @) [( n8 `2 P! T8 H0 s
      B7 o6 `3 z  B, x6 p; d" ]插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。
    2 V: A. J) `, S9 v6 j$ x$ Z( P& A/ p0 x# b) S7 R0 E
    如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n2)。9 f3 u* P# F7 N. }! D1 \, {9 i

    $ i( B* }6 G# ^2 r: N对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n2)。
    0 x5 @1 E2 J- k/ e
    7 A' v# G7 [9 z5/ w% P9 Q+ d2 \  W5 \9 F

    " E: u, l/ g8 u" X( T小结
    % \$ X7 [& T4 l3 Y' [8 a  b) U; T
    我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?4 D% n6 o' T7 t
    * V, n) Z* o- D3 z
    我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。
    / \; q9 b7 ?4 J$ a2 M7 _- P- E0 d1 ?. Y3 t3 q5 N" o
    元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。
    * s, ^" W* ~  Z; p8 P* ?: j1 t( p
    0 D- _# J  M2 J6 t6 M有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。
    ' P. x1 ~' h4 C7 @
    " p' ?3 N7 L& P* h虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。
    % F6 Y) h+ t# o( k& C
    , \9 L( {  e& }& M对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。7 q, i/ {2 ]' q6 k5 |! p; u* W
    ————————————————
    4 }, v! \0 m/ _版权声明:本文为CSDN博主「胡鹏程的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    8 _, b; ]! a7 S- t) Z原文链接:https://blog.csdn.net/lyshark_lyshark/article/details/126792708
    . g% h8 z3 q0 [
    ) b# k0 W* A% F' `: q5 K# {: d; }  B: M# t
    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-10-9 10:43 , Processed in 0.367527 second(s), 51 queries .

    回顶部