QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3065|回复: 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
    动画:面试官问我插入排序和冒泡排序哪个更牛逼?
      X5 X- C0 n: u. a- g7 p. d: @; `! {. y, _! e9 V# }; q$ v# v
    写在前边& ^4 X3 z, I6 N  W
    - j/ L9 Y, q4 a; x+ y( A
    # ?- @# m9 P  s* i+ Y- ]0 F
    排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。
    3 R/ G, ]2 Z+ g& [6 P  L% ~8 f" z* a* E: r+ X7 Y
    虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。0 U! n5 t( T3 Y( ~5 s; L# K0 h' n9 r' |

    + M! a9 p) l5 T  a7 e那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?: v# k; o7 J2 {4 e

    2 a, x- R1 F( U( y- Z2 P  h2 [. ?思维导图) b. t# F3 _! Z3 h6 C

    8 h. }2 }2 E6 U8 }+ h1 K: T( }2 y+ R. k  B9 g5 ~& {
    5 g% D" Y$ b: z. N6 D7 Y& a% k

    ( e7 e& _: z6 L8 s. ?0 B+ o1. {& ~0 F3 ?9 a9 v

    ( ^5 h2 m& N1 x如何分析一个排序算法?& c0 j' U0 @; L

    ; Y2 V+ O8 s4 Q: d& B6 Z之前写的一篇很详细的文章。
    + R+ ~/ }  Y6 r* m6 j1 q( \4 D& O& Z: c& P- N# _1 M
    佩奇学编程 | 复杂度分析原来这么简单
    9 t& _% y5 _% a7 ^' ]
    ' ]/ T1 I% Q' f8 R" Q$ e1 S3 U分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。4 @  b- {5 V) x. _* a7 e+ b
    % e; M# s' P8 M+ s5 ?# ?+ U2 P
    1.1 时间效率
    $ @2 x) _# v7 q% l- _7 @3 u3 b. ]/ @# j' o3 X, r
    这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。" C% V5 J& `' b0 P+ Q
    ' E. U; n5 C4 }5 Z
    复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。$ ]3 c. ^4 b9 \' a  ^! k( H

    ) r& e9 j. j( E' P! A1 P! n对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。# l( ^; Z2 N6 j. G7 c
    - ?1 S- @- z9 r% u
    1.2 空间消耗2 R3 {- q/ Q# |% e' ]; [- S

    9 U. F* y* @, d& ]4 r8 {所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。" N9 u; M- J+ G' a
    $ R6 |0 ~, w2 E" E+ z# n8 K, T( z
    注意:是额外的内存空间,存储排序数据消耗的空间不计。
    1 |7 \3 V7 a# G: W! O5 n" H! v- h  C8 z! A5 ^
    1.3 稳定性
    , e7 q% H0 M% i% t% K8 _: Y( @1 O* W* t% y
    算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。' z5 ]) r- A# d! {" Y( v

    4 |/ ?& h7 T0 i2 o8 O* O7 I2/ l: @+ y( ]/ t# a$ h7 r

    , r7 U+ }) X# |, E! W什么是插入排序?
    9 u+ N8 e1 C4 k4 C/ D# T8 J) [4 i- G* ^
    顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。) K) R1 R9 V$ t' p6 j  Q  C) m

    / y5 Q' c8 n! L3 m  _5 V# a4 x6 O1 I# R

    . ~0 i6 b- @! f" S% `; u3
    * A4 k. r! y  a# V
    , n& P: {9 Q1 Z8 F" K如何实现插入排序?( Y$ Y7 s! @0 M/ |+ c. I0 E8 m
    ) B$ b* Y  L% u" Y" h  J
    上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?1 b9 I7 q0 ~( {- }  A. `% O1 g2 K

    3 ?# F9 q; o* Y) C& s6 w# L2 [, m! v, Q" {. W

    " i- U" K  B8 b首先我们要将数据划分为两个区间,已排序区间和未排序区间。5 f9 z0 f7 i3 S' O
    * S- C1 h8 H' c; C# p8 S  `

    / U* s3 R# b! h" M" N# @
    # U3 j' ~2 V6 w. Y/ {4 l0 j& y% B+ Y# Q) U/ \" \4 ?5 j
    ( \, R) r5 p  o7 e* V
    我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。0 K1 r& H0 [% Y, L0 z: o
    ! G. Q7 w4 ~$ \9 e, B

    9 W2 R2 o8 r5 L" F5 C& t) v/ B
    " j1 @% S' U5 G1 z  ]/ D2 ?3 S) q) e. a; R5 K7 ]% w; k! C

    1 S+ f+ o9 J# }1 m3 |; f& ^如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。
    / Q" v) x2 g! c  ]  k. W0 `' m5 I; D0 U

    % e$ S0 t0 v4 h) Z# G( N( q' B) U4 g0 K: x, _

    + [0 H6 Y: ]) D" P" V3 C
    3 B: {3 Q% @) @8 r" d6 k" @最后我们看一下总的插入排序动画和代码实现。8 ~; `" z$ o1 i7 H; f+ ^2 y
    ' u2 m4 W$ f) \3 u0 Y9 S
    ; j  {9 o2 ]. q9 D1 B) k& L8 E

    5 P& q9 Z0 I! _' _  V) X4
    , v+ ]7 G# ]9 B. g$ m# S: e/ \. r0 S- L: l* h
    插入排序的性能
    , K$ Q  I7 c" M6 j. `/ ?: _
    ' S( e! w- B, a我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。) C8 O. M8 K$ Y- t6 o4 G

    ; S. x3 m% y" D5 L, p- M4.1 插入排序的稳定性# P9 ~9 A! S1 _4 L2 c
    8 L1 U: D/ W  {) `5 ^+ e  H
    再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。
    $ {( ^6 t1 B5 `5 H7 {2 ?
    # ^+ ]4 g! P+ B' _" D4.2 插入排序的空间消耗
      p$ t. F' `3 V. K, M. j* C2 K8 M. u. j# S  g& m9 ^. m
    我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。
    : [7 F. |3 d6 S* N! G5 @6 B' H0 o7 r; R/ c, H' m, E4 c
    4.3 插入排序的时间效率! l( p) h: S6 i# V7 k$ Q
    ! P* y5 y2 _) e2 I- [" [5 [
    插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。8 r0 c) t+ ?2 Y6 t7 i- x1 @

    / j' s2 a. y) G! {如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n2)。
    1 ]2 g! ]7 o1 \2 @& M5 \1 g6 `+ C! X/ \6 L. x% z" T5 K' p
    对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n2)。5 d  G  c! q. ?
    + K) i" @  n, s, q
    51 O( Z( [! e5 t( G8 }
    6 J1 U3 e- {% Q- s. o1 ^8 x
    小结: E6 P" v. `+ K% {/ ?
    + `. X1 m! s$ k8 k9 |- S
    我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?
    4 u1 k+ |' |; C' k2 E$ a. M/ }
    + A: h4 z, T1 [% Y0 a9 U- {我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。
    1 P0 l8 P4 V" k* P
    . `2 i/ I7 U4 M$ Q9 g& e8 B元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。
    7 h% ^: v0 k8 s/ w* v" Q
    - ]# I1 L  ?  J. I* X* b/ A有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。# H% P- T5 q* a' k+ v/ E' [: ~
    + U) q" @  y& c+ P( Q
    虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。" i% g# s3 ]( Z6 U5 M, M

    9 V$ |( V1 U. v  U% N- ~对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。, r4 N6 Y$ C/ \+ j3 L7 J" V% m
    ————————————————: C7 ?! H$ L9 p5 z
    版权声明:本文为CSDN博主「胡鹏程的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。5 U' E; k/ z; H
    原文链接:https://blog.csdn.net/lyshark_lyshark/article/details/126792708
    * x1 K$ Z4 U# e/ O" Z, i
    * L. _: t0 P, S$ i) d' C' U& ~) j$ w. A- F* T" {0 r' m$ ^
    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-8-24 04:03 , Processed in 0.387795 second(s), 51 queries .

    回顶部