QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1820|回复: 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
    8 G* x! |& H5 I6 ]! @

    / [: `/ a5 c- j5 M* ^8 ~神级基础排序——归并排序$ ?; K* U( g  A9 K

    8 A* s/ A) Q5 ~/ G归并排序的介绍
    $ N1 Z' V( Z( _& a. r( M* l) V- m' V3 H) o7 i
    归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
    9 E- D% c, h! M0 v! m9 [概念
    8 S' P' b: A0 W& w0 X* h8 `2 j
    5 Y: {3 e( O7 s是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。4 w/ }1 K; \# W: r+ Y6 s: w
    核心思想
    ; n1 A2 }6 c" N7 c* F
    4 y" o5 w7 }, \1 x( k% T将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。
    ' S/ R1 [0 y# a2 n. F' F) N# I( _7 g! ]( @/ ^0 O. L/ L. h

    . P) K' b5 A7 U+ V实现代码
    6 q0 o# S0 ?3 j+ p3 kimport java.util.Arrays;
    , o' m  ?* w& R8 X
    / h( o9 F/ @1 W  Y5 t) j8 `/**
    * \5 T$ F9 W) Q! g+ `* r * @Author god-jiang
    & t1 T- e/ L2 N * @date 2020/1/13
    0 F+ b5 C( l, [4 g) w */
    7 g. j- U4 S+ D8 o5 u1 v" U//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
    , Q' y, i: a; W& U2 Epublic class MergeSort {
    ( n# O  X6 m) b/ \# D* t    public static void MergeSort(int[] arr, int start, int end) {
    $ r" p# y; z4 w7 K+ h, `" r        //分治的结束条件
    ; C7 E7 l+ ]+ @8 J& {$ ^6 H        if (start >= end) {
    , q1 I) P2 J6 p# F. |/ `) R$ `            return;
    . o5 ^# v8 L# g2 ~6 B+ o" m        }/ w" G' s, v3 z8 p3 H/ R
            //保证不溢出取start和end的中位数8 m# s: U( L$ T! f2 O
            int mid = start + ((end - start) >> 1);  z9 p/ i7 r7 R* t# c4 C" K
            //递归排序并且合并
    5 M$ [2 v5 _) M. B        MergeSort(arr, start, mid);0 F0 H6 w% `2 {$ p9 O/ |) e
            MergeSort(arr, mid + 1, end);
    3 |. p, A% [0 m, b: A7 ^! b/ e* W- l        Merge(arr, start, mid, end);
    3 m! N/ k# u( R; ^( ~2 h  D/ C    }
    + ]+ R4 Y. D8 m9 z: O: H' W
    ' h$ \( t1 ]- b0 w8 \    //合并1 i* C/ N7 a- B- |+ C6 X. q
        public static void Merge(int[] arr, int start, int mid, int end) {4 e- z1 P! s. M7 l7 U7 Q
            int[] temp = new int[end - start + 1];
    6 a9 d/ N% V( @/ s$ c        int p1 = start;  b' j/ x  l+ ]' A& J
            int p2 = mid + 1;
    - t" H, Z: M8 W# A        int p = 0;5 d7 N9 W, r. S6 C$ n
            while (p1 <= mid && p2 <= end) {5 j' s3 A& ], B. S4 v# x4 ^4 g6 T
                if (arr[p1] > arr[p2]) {; d$ ?7 l0 U& d$ p% z; U2 K
                    temp[p++] = arr[p2++];
    5 x# A/ {' X& ]& z' p            } else {
    7 I: R" U) H( O" N                temp[p++] = arr[p1++];" L6 a% f+ _4 e1 [
                }
    ( }5 R) e0 D) `5 {5 r5 A" k        }
    : z" D2 @) z1 w# L, h& ?        while (p1 <= mid) {
    # r9 K4 k- v8 g" L9 e* {2 B            temp[p++] = arr[p1++];
    - u  H8 Z+ ^% w: X+ N0 F        }
    , t3 S, ^5 L2 |# H) k' A        while (p2 <= end) {
    4 w0 X! e9 ]" t* \  g+ d  \# T            temp[p++] = arr[p2++];4 \1 |1 ^: a+ C8 ?- L) ~6 }
            }
    ) o' W- N1 t/ Y* d2 d7 U* |; ^        for (int i = 0; i < temp.length; i++) {% L+ ?  R. I: @0 r
                arr[i + start] = temp;
    # E) s' L+ w- ^& E' N1 m5 X0 K        }
    # e8 n' h. }, e! I2 q) E; G& ~    }
    8 N) o  h4 y6 r5 g0 i. P+ I9 L. u; P8 _
        public static void main(String[] args) {' P# U! l/ U5 [9 z- W+ j
            int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};+ N1 y# z8 X2 T
            MergeSort(a, 0, a.length - 1);1 q% S/ S* I$ ?1 {, V2 G
            System.out.println(Arrays.toString(a));# n& {6 O( p- \0 @
        }
    / g8 W+ U$ G) P) Y}" N+ [6 E  m2 @

    4 U& y$ m# G! k
    - `) c9 M& e3 Q运行截图
    7 O: ]8 P6 H7 P: i% S
    7 [7 p2 O5 E& p" g" w  X0 D 1.png 7 \* X6 g! N# a  J3 `5 }4 u  [

    8 _% {9 m5 f" e, d* W1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
    - U1 c* Q( y5 G" D, Z2 ^2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到8 s' f2 `0 [" Q

    & G2 Y8 f, o" z9 Y) P$ Y& j原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035$ s/ Z1 B; C- N- X

    8 x" L! i$ o  s$ F
      C5 ]9 @: b7 Y
    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-6-9 18:50 , Processed in 0.280325 second(s), 54 queries .

    回顶部