QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3014|回复: 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
    动画:面试官问我插入排序和冒泡排序哪个更牛逼?& a4 }0 p- ]5 f8 y( K( G6 F1 n( }% e" o

    - b. ]* A) K. ^  L" t1 i3 F: T写在前边2 @( s- z6 a/ k4 l/ ]' P

      N6 ~$ Q/ c: f+ Z9 g+ J, Z! G: K; ~$ b$ ?; q4 S
    排序对于每个开发者来讲,都多多少少知道几个经典的排序算法,比如我们之前以动画形式分享的冒泡排序,也包括今天要分享的插入排序。还有一些其他经典的排序,小鹿整理的共有十种是面试常问到的,冒泡排序、插入排序、希尔排序、选择排序、归并排序、快速排序、堆排序、桶排序、计数排序、基数排序。; S/ ]4 Z) N; q' A
    5 e9 l$ I5 j" j0 e( Q
    虽然我们基本知道了这些排序算法,但是在实际项目开发以及面试中往往出乎我们所料。在面试中,经常会被问到各种排序之间的比较;在实际项目中,往往排序的数据不是我们所练习的整数。8 d) e. C. I- K& @' g# C6 F
    8 t+ D2 s# Q+ _' B; ^+ K; M
    那么今天我们来学习一下,插入排序比我们之前讲的冒泡排序有什么区别呢?面试官问我们,我们如何回答完整呢?
    : a+ h5 B9 v# n9 [9 t4 u3 m- V0 c8 o; z8 e. J
    思维导图8 u' u9 z( r" |9 V

    2 S' z0 x2 `4 t5 F6 w: ?) N9 h0 c; }3 j0 c4 Q, o
    + b2 d& ^% t) a( F8 J
    / ~! X  V, E  n0 B
    11 ?: |+ h. A# H3 _: A

    1 c" G* {0 K% F$ f! z2 T如何分析一个排序算法?/ E( i, I+ a, y/ @4 j9 ]
    3 N' f: M7 u6 A, H  e# |
    之前写的一篇很详细的文章。9 {6 ^7 x3 Z$ l: @5 n2 S, n! S; B

    / t2 x& F; X% i* T- ~4 S' ]& x6 M6 K佩奇学编程 | 复杂度分析原来这么简单
    , m- f. {( v2 y! d
    + M' J4 a  l/ @; ]  \& K分析排序算法已经成为我们衡量一个算法优良的重要标准,从以下三个方面入手。4 ^- u0 |$ z8 K; D% r: Z" ]6 G# e6 Z

    & E& Z, }3 w5 i5 n9 v1.1 时间效率
    % ?2 b4 T7 S" o6 y
    + Z7 A1 r7 Y7 [# v1 Z这里所谓的实践效率就是时间复杂度,相信大家对于时间复杂度并不陌生。* o( v2 ]+ z3 D- [3 v4 R

    + z5 n$ Z4 q1 o! j复杂度描述的是算法执行时间(或占用空间)与数据规模的增长关系。- T7 g2 N* ^/ S" Q+ L

    2 \) S* X$ ], X5 ~4 o" {7 c对于时间复杂度的分析,要把最好时间复杂度、最坏时间复杂度、平均时间复杂度分析出来,分别对应了排序算法的最好排序情况、最坏排序情况以及平均排序效率。5 z+ x8 _7 H* H* M
    8 f0 x& F, e1 N. E3 c- y
    1.2 空间消耗8 q! W* i$ U" l; s
    ! w  g/ e8 S+ `$ z8 k) w# m/ }
    所谓的空间消耗对应的是空间复杂度,在排序算法中需要开辟的额外内存空间是多少。如果空间复杂度为 O(1),此时该排序叫做原地排序。
    6 j5 Y+ m# ~' @- f
    . d7 W- [0 G! \* O# J注意:是额外的内存空间,存储排序数据消耗的空间不计。% M3 I9 m; V/ D2 I
    3 g3 v. _$ l2 I6 R: O
    1.3 稳定性; Y) t' b" y3 m  U3 W, X* ]
    6 Z4 H( a; Y0 v0 {; v+ ~
    算法的稳定性虽然我们之前接触的很少,但是稳定性也是衡量一个排序算法的重要标准。什么是稳定排序呢?比如有一组有重复待排序的数据,排序前后,重复的数据顺序不变,此时该排序为稳定排序。否则,叫做不稳定排序。它在实际应用中非常重要的,今天我们就不多说,以后会慢慢分享到。
    + y# o& w8 {$ D" z; u, }. ^% L6 w0 p2 L8 U2 @4 {7 F9 F) E
    2
    9 y0 m, u! S; [+ y: b
    2 X* I7 Z$ U0 w5 _7 f什么是插入排序?3 O3 \7 i3 G" M

    2 c3 W7 `  J) u% y% A, o7 ?顾名思义,插入排序就是通过插入的方式来排序呗,最经典的就是打斗地主,可以将打乱的扑克牌作为未排序区间,手中已经排好序的作为排序区间。每次我们摸牌的过程,就是从未排序区间,通过插入的方式,插入到已排序区间。那么这个过程就称为插入排序。9 e' Q( r$ C* g/ o- S1 @3 e. B

    ' J# V* E3 T$ ~" _2 |, I1 h& ^5 L( B$ ^: ~9 O1 X

    5 Y" E2 M6 a5 I& }, q3" [& R# I0 [5 m
    ( d  c$ ^/ g! l4 w$ \0 {0 ?$ x3 D
    如何实现插入排序?% w% a8 \9 |4 ?6 u) \! M8 L7 |
    # t% g8 q& O7 E: [
    上述插入排序的概念我们已经理解了,那么给你一组数据,如何来进行插入排序呢?4 e2 @/ U7 v- L. L# j# v
    6 G4 }1 ?/ u3 g8 r" x

    . Y- N( m3 x8 D* n8 T: B9 o
    4 {6 y$ E! [7 S1 x( o首先我们要将数据划分为两个区间,已排序区间和未排序区间。8 e- ]+ o7 ~# q' k4 H, h
    / D% L6 M; i( D3 E
    6 n' O# g3 r3 _0 o5 [; v- f6 P/ h
    5 U5 r* A2 j, _5 w9 j

    3 i7 C/ f0 M4 v* L+ n; D) O5 H6 U. L+ ]- b: a1 ~
    我们从未排序区间取出数据和已排序区间的数据进行比较,如果小于已排序区间的数据,那我们就交换数据。
    ( j- v7 c. o/ T2 ^# F7 ^! M1 V& J- |* j4 u4 x+ P* S
    9 ^9 W" |5 w- r5 K9 Y
    : `) u; N5 p( q/ b

    7 A: c- a. b/ v$ g1 i, [& t: C# d8 i/ J0 L3 w
    如果交换到已排序区间数据不在大于插入的数据,然后将元素插入进去。3 H; E, R1 J  b# @

    ) Y& D6 H1 A: N6 d9 r* D0 g! @$ {$ v! h

      T9 z1 v" R6 u9 y: d$ @9 K4 g+ h$ s$ m
    : J; V) `/ V$ \7 ^2 M$ B6 }1 T' w
    最后我们看一下总的插入排序动画和代码实现。
    $ W5 h: O! g  i( u
    2 \# j( X- O3 F5 ~! p8 Y3 l+ @& M+ S# B3 R
    1 S5 X# N6 Q! J. `8 b) [- K. g
    41 [! I1 ^  ]& u6 K! a( ^

    - R9 H. u: A5 d3 |/ n7 z插入排序的性能
    * a9 b7 g. |% _  |  _$ q3 o& l5 z, k6 F$ G  U
    我们通过上边的对插入排序的拆分讲解和动画以及代码实现,想必面试官让你手写一个插入排序可以轻轻松松写出。但是我们掌握的插入排序知识还往往不够,我们在实际项目中,还要考虑插入排序的性能怎么样?因为才能更好的选择适当排序应用到项目中去。- _* l! d$ a4 H6 W

    ) E4 }# P* c* s# ^6 l6 r" T4.1 插入排序的稳定性
    , Q" `1 o; a5 O3 Z# A; n4 V8 V! B4 P" |! O  i3 p
    再插入排序中,如果存在重复数据的话,前边的元素再插入的过程永远在第二个重复数据的前边,所以插入排序后的重复数据前后顺序不变,所以插入排序是稳定排序算法。
      a/ V3 e! U' d7 c3 D
    + r, l! J+ W4 b+ |( x" D9 p! I4.2 插入排序的空间消耗/ K) m6 h" X$ m/ _6 {# T& V0 q$ a$ E
    & M- v* o) {9 X8 m4 @
    我们可以发现,插入排序的移动方式,需要消耗常量级的额外内存空间存储,也就是代码中的 temp,所以时间复杂度为 O(1),我们上边讲到,空间复杂度为O(1)的是原地排序算法。
    & h) B* V& {/ V1 F# S% i
    0 M5 j, H! B: X  A4.3 插入排序的时间效率
    : S- D9 U) m* V9 m$ j! l& J( f4 z, J' Z' I
    插入排序的最好情况就是不需要搬移任何数据,从头到尾寻找插入数据,每次只比较一次即可,即一组有序数据,所以最好时间复杂度为O(n)。' m& o! |# C" H. F0 H: h
    3 ~+ @! u% f% u* Y
    如果一组数据正好是倒序输出,那么每次都需要比较移动所有数据,每次移动时 n,n 个数据时间复杂度为O(n2)。
    6 |: a2 H+ b2 Q3 ^2 o
    - o5 o/ p. o) U+ G对于插入排序的平均时间复杂度,每次插入都要移动数据,插入 n 次,所以平均时间复杂度为 O(n2)。6 I" ]% w3 R- @# J; a( w: t

    $ J' j1 n- E# y) P5
    5 c. p  i# z0 N' D1 I
    7 h6 ^- V1 u5 x; j5 B, d% C小结+ [$ r5 w4 A* j2 A  h1 C. P

    : s/ Y5 s% J( N我们学完了今天的插入排序之后,我们回到最初的面试官问题上。插入排序和冒泡排序哪个更好呢?
    9 a2 ~- B& t, g/ C4 o0 @% `$ N+ P9 T8 t, g* z5 U& i
    我们现在元素移动次数上进行分析,如果一组无序的数据通过冒泡排序排好序之后,它的交换次数是这种数据的逆序度;对于插入排序来说也是一样的,移动次数上都是原本数据的逆序度。
    5 m1 ?% c1 J4 L3 O, M) C7 T- k4 C+ I4 z; G0 X( S* v
    元素的移动次数是相同的,那我们接下来看看元素的交换次数。从代码上分析可以明显看出,冒泡排序的一次交换需要三行代码,而插入排序的交换却需要一行,所以总的交换次数冒泡排序大于插入排序。
    * T3 R4 t/ L* o; A  _, i& z+ K/ J% q8 d
    有小伙伴会问,这两行的差别有那么大吗?移动一次,我们可以不计较,如果数据很多,想想下,两者的效率差别很轻易的就比较出来了。
    3 J3 k  N* x" a. O9 o% h3 f9 A2 p1 T! P- z6 N+ U2 _3 W+ ]* r
    虽然冒泡排序的时间复杂度和插入排序的时间复杂度是相同的,但是我们实际使用中还是优先选择插入排序。
    7 W( K; s! d7 I" [( H3 N7 W  @( Y+ X0 z1 S; t4 E
    对于插入排序还是可以优化的,对了,没错,就是希尔排序,我们在这不多分开写,后期会继续更新。! t' E. n9 B( y! z- s) t; c$ O
    ————————————————/ i6 n5 G2 W- {. _
    版权声明:本文为CSDN博主「胡鹏程的博客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。8 \& a% n/ \# c) O
    原文链接:https://blog.csdn.net/lyshark_lyshark/article/details/1267927084 F5 v8 r* u+ I* J/ I9 G6 Y$ m
    : g) m, I9 E' ^8 |

    ) W& I; Y# `. a$ O
    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-21 02:23 , Processed in 0.446470 second(s), 51 queries .

    回顶部