QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3052|回复: 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
    动画:面试官问我插入排序和冒泡排序哪个更牛逼?
    6 U) C& }/ |1 D+ ]. W* d- ]# @8 @+ K$ i# l, \$ r7 v$ e
    写在前边
    # V! q0 m2 J! H; ^1 v5 d; n% u/ q/ I/ w
    4 G3 t) E8 b/ H
    排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。2 h9 l# O4 x- X
    ! |, D) n$ q* x% C+ ~( y
    虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。/ d5 D# b# d8 i, B' Q7 v

    6 a2 N1 @$ j; m/ J那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?
    : ~/ U& w7 M% x8 `; u; R; x) A$ e0 ^- ?( q8 h9 A+ _
    思维导图, T: I3 U: A  G9 \' |9 R

    2 n0 W4 Q3 F) M" D% L  b( @6 C0 q5 B# _8 @1 b5 ]
    0 G* j, q3 A+ i8 e: H
    1 `+ ?: f/ s( @  w8 Q( d% x; A
    1( L1 w/ T& X. F: p6 O

    " ?1 x# a4 b$ D# z' f# O# P/ H如何分析一个排序算法?
      b7 E' \, l. b2 Q
    % n  t* k  q  h之前写的一篇很详细的文章。, W  ^2 y$ {0 Y1 |) j0 N4 h8 s
    4 T  }. S$ ]7 V' K/ Q
    佩奇学编程 | 复杂度分析原来这么简单
    - h. L# d9 h, h" s7 v) @% ~5 L
    分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。
    ' V/ q4 ]4 E( T/ R/ {, S8 T
    - @1 j) s% n. Z1.1 时间效率( S6 ]5 N2 }1 t, t. G% B
    9 g: M) L" o# M* U6 _# l
    这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。
    8 L1 j; ^0 F! b! E
    % V% k4 S/ W$ w4 R3 I复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。$ \6 j6 E% ]6 ?8 ^
    , V) n; E) c. r. _% E
    对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。+ Y! g& i8 ^8 p2 L

    ! h( D" B% ^7 e% ?- e1.2 空间消耗; O5 ]' J/ j/ m* `, N. n" ]" j
    * S' g1 h1 b" C7 t# m# I  g% v  U
    所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。
    , O6 z5 ~9 a2 q0 n% d5 {5 b; r% E# q3 G2 w; B
    注意:是额外的内存空间,存储排序数据消耗的空间不计。2 T  Q( ?1 D: d' [  d6 @

    , z" [# P& z$ z9 {5 p0 k" @$ u2 |" K8 m1.3 稳定性6 C5 A3 ~3 ?" M- _& Y
    * P4 l8 v/ Q7 j" O$ k# |
    算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。
    + C# T8 o& Q+ q% @" |$ T
    ; S2 A, {: ?. A# J  P) E' U2
    7 g/ h* k8 Q3 ]+ ?, r, _
    , W; p# b0 u8 A/ I' K; s3 [, j什么是插入排序?0 J. k2 t" z- Q% l& }

    & J. e: M/ U/ {顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。
    / n" d; R) U' \( j& Q
    - P! K8 J/ E) r4 S$ F0 H$ o" }
    2 Q. p* m' I! Y- i
    ' z3 u$ y& O# [3
    % u" F% A: N4 ~1 D% O9 b4 y" G% L
    , e! y+ `* ^6 Z& \如何实现插入排序?
      z1 v7 J  Q; Y- K2 Q! y9 C0 A* W2 h# E* G
    上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?6 p6 y% w) K/ n7 _2 h
    6 L, U; G7 X) S9 Q: i  I

    2 e/ O7 X% j4 u" V# y0 R  G
    : D5 F# N3 M% z" T! p; }1 ]$ g1 S% N首先我们要将数据划分为两个区间,已排序区间和未排序区间。
    " ^. R& m, X4 y' H8 q+ h
    : S$ L2 K) |2 S% A" I
    / ^( r7 L+ T; i! Q- k" v, r+ R) t; V  j4 a; t, C1 R9 s% ]

    * N9 }" H4 G/ r% b! A8 l, J  f  v) R5 Y0 ~  s8 G
    我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。
    4 p( {- \0 M: U
    ; H& {7 g' L+ r; C) e8 `- A9 l4 p/ k# n$ [+ u9 A9 T* A" ~# [

    " ^3 j7 R6 C( B
    % ^& A5 i, C1 b; ]
    + R! I9 O7 H  f  V# \- K! N7 S如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。
    9 j5 E4 @/ C& m- |  [; p+ r. o( ?* ]# ?- f3 u# i$ ~8 @
    " i7 d/ N! l7 e& t# V/ m

    ' O8 Y6 _% k4 u' K. m- c  C6 u% X+ R' Q8 O. U  U; L* a
    % O( [/ [5 a# K& b5 @# P
    最后我们看一下总的插入排序动画和代码实现。5 [) s+ D3 ?& k
    * `& z; H2 U0 n  M! Q' S) I% Q; R
    ) t/ H# s. R3 m/ s
    9 o# ~2 B% d& _3 Y. Q4 R' L
    4, J7 E7 e: X( w8 g

    7 _) j1 m) `9 B$ C插入排序的性能
    / C/ t4 e3 b/ i4 ~/ ?1 I! ]: L( G" O* u5 d/ c
    我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。1 a1 z2 I& \* a4 I7 h4 ?* l2 H: a- p, l
    # b. ?0 _5 Z4 k  F. ^5 s) q3 _
    4.1 插入排序的稳定性1 Z6 B& r. e6 T% \" P8 Z

    5 ^3 K! ~+ N/ n5 i+ _9 [1 L% {9 w再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。
    , a" ?! F" I# e7 C0 f9 w# @& e# j  w1 U
    4.2 插入排序的空间消耗1 M/ ?* W" k) J% r% ^2 ?

    ! Y, y& Z; J5 l( p' B1 {我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。
    ! j9 n  Z5 e8 X) \' r: a8 j
    # }  ^9 p  u! }! W) D9 r4.3 插入排序的时间效率
    % \, ?) {3 i. I. G# X7 _. w3 m/ A/ O% ?' e; d6 c0 G( e
    插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。
    / C/ h. p* j0 n7 J3 P& V8 V2 ^  q1 G2 _" I/ e! ~, f
    如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n2)。& _* l) \. W: w0 _' G
    3 \2 P0 _8 C' g4 i8 ]% Q
    对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n2)。6 U9 V% G  t7 V. N2 Y

    : N9 G* t: T! M' B$ Z5: e7 E' r' @1 H# r

    : E8 i  i6 z: l- C小结9 i) L8 Q( x' _5 ]" g

    # @. Z7 Z6 r% _  J我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?
    ; x/ |) u# \5 m8 N% n6 @  \, E" p- M
    我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。
    8 S1 M9 W! u3 [5 ]: n0 _
    1 Z+ C1 Z' \! a元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。, s1 |: }: O3 M" }' \8 P3 Q

    5 h( Z; ]7 G( Q$ C! j. j1 l: \有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。( C: `0 }, _) n# S, p! C
    ! ?0 ^/ a% M8 f" |# @' `0 b
    虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。  {2 E7 j6 x: \! O4 G
    ; W" h6 P: r3 \) f- E
    对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。
    + f4 f: ]9 L( Z8 u8 f8 T————————————————
    $ d( V) k# D) G6 M5 ~/ @版权声明:本文为CSDN博主「胡鹏程的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。& R+ B7 a* r- T+ A2 K$ D
    原文链接:https://blog.csdn.net/lyshark_lyshark/article/details/126792708
    : p1 `! @& G6 v4 M) }7 P' |8 L5 S$ ]( K7 t) {* e3 L0 N
    . C- u! `5 p% ]5 v/ ~
    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-28 11:44 , Processed in 0.365550 second(s), 51 queries .

    回顶部