QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1857|回复: 0
打印 上一主题 下一主题

神级基础排序——归并排序

[复制链接]
字体大小: 正常 放大
杨利霞        

5273

主题

82

听众

17万

积分

  • TA的每日心情
    开心
    2021-8-11 17:59
  • 签到天数: 17 天

    [LV.4]偶尔看看III

    网络挑战赛参赛者

    网络挑战赛参赛者

    自我介绍
    本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。

    群组2018美赛大象算法课程

    群组2018美赛护航培训课程

    群组2019年 数学中国站长建

    群组2019年数据分析师课程

    群组2018年大象老师国赛优

    跳转到指定楼层
    1#
    发表于 2020-3-30 17:02 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta

    4 _# o. U: R' f0 K9 ^2 ?' p( p
    神级基础排序——归并排序
    " [# n/ P8 q- P( `  i) ~
    , Z% r- ?5 W- i" S! E归并排序的介绍
    & f( D0 r  }. W* f
    & p9 X# C" Y: I归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
    ) c! y2 }% U  m概念/ J  I$ H3 M8 ~2 k
    ' }& n# z5 }6 I( b. M
    是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。& E1 P+ F( Q( ~
    核心思想
    7 _( ]( n4 I! u1 G8 |8 l/ O
    ) Z5 B; T" [- m6 I- C* j1 H将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。2 \% G9 n+ v4 O0 {& P9 d
      A: k( [! K7 {" R+ H/ j" o! o# m
    9 P( R' X% {" w! r# K
    实现代码! o" o2 q5 u9 z7 Z, @' u" g% n
    import java.util.Arrays;5 C1 \  Y1 v  h0 M

    ; a: ^5 \' |6 y& a/**0 p" ?4 j' A: A9 R0 ]2 Z
    * @Author god-jiang& M4 P& g: p8 ^$ t
    * @date 2020/1/13- `# X! ~5 K' H
    */2 a+ G& ~( P& j8 H' E: V
    //归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)3 G3 X- d/ W) D* c3 s5 o! t6 z
    public class MergeSort {
    & C5 P, |: X  R    public static void MergeSort(int[] arr, int start, int end) {
    $ d0 s  O6 z2 h* Q  U  K" Z        //分治的结束条件0 v: X9 m: t& @5 P/ l7 N) g
            if (start >= end) {
    ) O, }& m: [" B: k            return;$ E- D1 j4 f* v5 _8 s" c
            }
    2 T. s& R- D- ~        //保证不溢出取start和end的中位数
    + o) H% |) }* }/ E+ F  Y        int mid = start + ((end - start) >> 1);
    $ O* r" ]& G: `: a# L; P0 P% S        //递归排序并且合并$ g/ b0 o1 Y. ?* {2 p& w* z
            MergeSort(arr, start, mid);
    3 {2 d5 g* g) i        MergeSort(arr, mid + 1, end);
    $ c" u4 [8 M; a+ Q& H7 m$ S        Merge(arr, start, mid, end);. W$ h2 q+ J2 t
        }
    $ Z( L* n6 q3 y0 M9 a. N! Q! T. j# m# p( s
        //合并
    8 a- H8 B' E6 g. w+ O6 P    public static void Merge(int[] arr, int start, int mid, int end) {7 ]1 `4 Q/ e" ^& |
            int[] temp = new int[end - start + 1];
    7 ~% L; c' H, g; f+ A6 i        int p1 = start;
    * {2 R( e% A% p1 k, h6 [- `$ r        int p2 = mid + 1;! _  c4 u% W6 O8 G4 V# a0 S
            int p = 0;
    ( g' U: g/ p3 O2 ^! Z0 E        while (p1 <= mid && p2 <= end) {
    * l9 O3 m5 J7 q7 [$ C            if (arr[p1] > arr[p2]) {% [! Q7 m* ]# `, I: R/ m% W
                    temp[p++] = arr[p2++];3 D6 W+ S0 ]  q5 x* S) A
                } else {
    ; T; s* l7 e5 V8 \8 y2 D2 o: S2 H                temp[p++] = arr[p1++];  |3 t/ B) E* o& t
                }
    + A8 ~8 d! v( J! u9 t4 G# }0 f5 i- s        }
    9 s4 j& L- t# Y        while (p1 <= mid) {2 n* V; t( u. L! T! ], m
                temp[p++] = arr[p1++];' i" M* N" I, _; p0 z0 v: H
            }
    1 V9 g" N* ?; X        while (p2 <= end) {1 J0 _5 v1 m. r
                temp[p++] = arr[p2++];
    , \, j* a3 P! Q, g& G        }
    9 ]* e. f( H$ ^* C1 F5 [/ ~5 f        for (int i = 0; i < temp.length; i++) {0 Y& f& l8 t( ]1 p" D- Q
                arr[i + start] = temp;
    % P& ]" @1 c% g9 p        }
    ; O4 M; `. U! ?' t    }) f, d: Y0 H+ O. k* K( t0 J+ e
    ; v$ y' ^2 \$ K2 s
        public static void main(String[] args) {- M3 g5 I/ }" j* B: A* c  ?/ E) E
            int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
    8 y5 F- w- c( R+ l- b& d9 U4 p        MergeSort(a, 0, a.length - 1);# [' P9 U2 g4 ~5 l: b
            System.out.println(Arrays.toString(a));3 R  s3 l) g% O2 t0 Q( F( k% m2 r9 \; p
        }
    4 U/ B; P  B. @}
    ' f" l' q6 G3 H- t5 w9 ~& k! d- a  H/ U$ T; H7 D+ x+ |0 A
    . x, ~' c* v4 a4 p% c
    运行截图; r/ `# |# ]9 b9 T

    : W4 f# Y# D' c" c+ E 1.png ! }1 E* y+ A5 x& o& O! I7 M7 o5 @

    9 u; A7 M* h5 C9 J- H& _7 r: x, [1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
    ) T1 p6 V; a$ T# n2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到7 ^1 s" u, G6 |# o4 I  v6 C

    - s" P1 x4 {; v- A/ |原文链接:https://blog.csdn.net/weixin_37686415/article/details/1051800351 M8 _) y( B6 Z

    - j3 K7 M) I% {! I* R- J8 t% W
    * j& h5 N6 g4 B0 p
    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-25 02:34 , Processed in 0.283686 second(s), 54 queries .

    回顶部