QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1798|回复: 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
    * ]  u. G, Y0 K5 K4 l

    6 T- x6 v6 T( t" q) _# K8 O) C6 R, d$ w神级基础排序——归并排序3 ^& [# w4 Z0 `, A! P

    , N4 i8 g) k, t: k$ x6 V' M归并排序的介绍8 h  ^7 m$ \& q# G0 G/ d
    - ^' x/ g  ^! T6 q$ ~( e4 s
    归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。+ C. V& j6 _5 C7 j
    概念* R, f) }! j" ^; h

    6 z6 j8 [7 E2 N4 t$ e, b! k是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。/ e& M! c' W& U
    核心思想! y; X$ A3 n7 I0 `  ?8 v9 ]4 s5 v

    & \; ?1 S- e: t7 M2 A4 g$ e将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。
    9 z: y: c2 R) o3 l7 _# a2 _5 U8 G& y0 Y2 o& b. C% ]5 A' n; r
    ' i) y) m- f( D9 c& b
    实现代码
    . {4 b! M* H5 L# E+ Nimport java.util.Arrays;
    # ?( G( l: [" J% \* ]4 V$ o+ J9 }+ e. @: P# E& G
    /**
    ) c8 `) g4 ^% H+ j& P3 {5 l * @Author god-jiang& Q1 c) j5 K3 o$ }$ S2 T
    * @date 2020/1/13
    + c! o" T+ x' I */, ^7 K+ K6 t% |  N6 f; M
    //归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)" G3 a9 m7 J. g7 y( v4 N
    public class MergeSort {3 A) e) H. }3 U1 U+ e; c3 V$ ~# p
        public static void MergeSort(int[] arr, int start, int end) {. S8 |4 B( d9 T$ `' n, y1 b! D2 q
            //分治的结束条件  I7 ?- L  X  G
            if (start >= end) {% x, y% Z4 H. K. b- f
                return;' [/ O$ Q* m9 f
            }
      j) ?2 A3 B8 }- y2 y+ t        //保证不溢出取start和end的中位数
    ( F6 N1 X# ?1 L+ M! Q        int mid = start + ((end - start) >> 1);
    # L8 f) B! }0 [% c        //递归排序并且合并0 v$ ?. v2 B0 s9 ~! a
            MergeSort(arr, start, mid);/ n7 a0 ^% c4 s7 o- p: G0 J" O9 a
            MergeSort(arr, mid + 1, end);6 ?2 n2 l; F6 ]
            Merge(arr, start, mid, end);' U5 W( L  D$ r8 H
        }2 S! D- ?1 s) D% F1 U! `

    8 p+ x- Q1 R  [    //合并
    & P5 \! ?* P) Q    public static void Merge(int[] arr, int start, int mid, int end) {
    - V1 L% F: {! n' X0 b3 p, R        int[] temp = new int[end - start + 1];2 u5 t- I7 \' T: K5 K4 j2 Q  q3 ~
            int p1 = start;
    , a& E& I6 v" L% W# g" H- W5 c        int p2 = mid + 1;( S! z! w3 b  d5 J1 x  z
            int p = 0;
      X4 Z. Q2 {7 ^$ ?' U( U* p        while (p1 <= mid && p2 <= end) {
    9 x. s' @; V9 V$ m            if (arr[p1] > arr[p2]) {
    + S, I# y; V: v4 G9 w. u. K. t                temp[p++] = arr[p2++];8 M* {; j+ h  L6 k' P0 u5 b
                } else {
    + Z+ `& c$ y7 y. v                temp[p++] = arr[p1++];
    % @* I0 Z2 [3 i; _" g& ?            }
    5 c2 E9 r! ?) g0 K; Y" X& V) D, K' x        }$ A; @; v) E) J3 |8 r
            while (p1 <= mid) {4 u2 o& g" A' I' j" y
                temp[p++] = arr[p1++];
    # X& U* c4 T; W4 B        }. |, R. `3 a9 _- h
            while (p2 <= end) {
    ' n4 ^1 \* i( N            temp[p++] = arr[p2++];
    - R/ `, A) Q3 Q3 D9 S8 B! D        }
    , @3 m) X, n7 {/ g3 U) _1 M# c1 S        for (int i = 0; i < temp.length; i++) {
    - E4 }' a& a% H6 d            arr[i + start] = temp;
    # E* M! A  c+ n* L4 `! ?        }% ]8 `5 Q5 g/ C+ X& K2 H
        }5 c5 F2 }9 f( ]
    % Z* ^9 `' Q1 m. N% n, n
        public static void main(String[] args) {
    9 u3 i  d2 P+ @8 V: P        int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
    , h5 U! Q( \, F8 i( E) `  Z        MergeSort(a, 0, a.length - 1);4 M$ E! o$ v2 f2 [$ c9 V
            System.out.println(Arrays.toString(a));$ ~* ?+ t0 ]! G2 g  m
        }5 M1 r5 J5 a8 K4 Z
    }
    5 o6 Y3 N  }' L% @8 ^- X
    ( }5 g4 H! M4 [, p9 N! U( J  m( J9 [' m- c: G' @
    运行截图: H, Q- X! b4 F+ z8 }: \% U% R, O, n
    ' w7 s) _# n: ]
    1.png # A/ s4 I. [" _+ e

    & Y6 ~9 J  [, ^% J1 o0 q% }3 S1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)( k, m6 Q# [, L6 k; [+ K/ ?- n
    2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到) N' ?$ G5 ^& B, n3 e0 A/ ]9 R7 R
    1 @! a& z% S5 A; l
    原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035) \" K* B+ V$ t' n' |* a: H( V' c
    , ]- M- Q# x3 M9 A, R9 i8 G. I

    + v5 z5 ~- \; H, ]" _5 n; _, {
    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-22 12:02 , Processed in 0.747434 second(s), 54 queries .

    回顶部