QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1856|回复: 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

    : b5 O  N) \, y: k2 n* y+ r* r. k+ `/ W( R5 m- d& Z# _
    神级基础排序——归并排序# x1 j! Q% F" l, \

    * K+ g7 U+ @  E5 c- S归并排序的介绍
    / k$ Q9 s  ?# q
    9 C+ i8 p2 Q6 N5 [$ j归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
    3 C- e% e' e& J, J6 x概念
    4 q( r0 W8 w* }3 ~5 e
    5 U( K- W  T0 o8 A+ r7 X是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。( p! k' C& @" q/ o
    核心思想' E0 |6 k3 G" a0 O, Q1 l

    ) x* o0 b1 H" k) g7 f将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。. Y9 w# I& U* _5 n0 w% A

    5 }* e% o- P( }' p/ _
    / s5 X* ]/ t. @" |$ B  b/ G实现代码
    7 Z3 Q- K# `/ @! \$ w! i& aimport java.util.Arrays;/ m5 {( m9 X# [$ h$ d" p

    - x: g  \5 Y' o) S) @% o/**
    ! }9 ], ?& R# m; t  L7 X- P * @Author god-jiang$ k3 I" N. M4 b! A
    * @date 2020/1/13
    1 K' F1 A. B9 T2 s; f */; D4 Y" A6 C* `6 p/ f
    //归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
    & [) j- F# c- }7 }public class MergeSort {3 o  Y8 @& x& z) t2 u# G
        public static void MergeSort(int[] arr, int start, int end) {
    3 h$ \6 s- H+ C7 s; z0 X        //分治的结束条件
      P, M5 x8 l; B3 y+ N8 X- T) }        if (start >= end) {
    % F$ K; T: e2 o- [5 Y            return;2 r% }. |; I2 |# n4 {4 F% ]
            }0 m* v+ C$ z  M% M8 d0 }) ~
            //保证不溢出取start和end的中位数! e7 e& G& Q( U0 i( B! V" u3 T
            int mid = start + ((end - start) >> 1);, `' E1 b8 F# R6 ?7 O5 j& f0 {. B
            //递归排序并且合并
    7 O# P+ Q: P& P; Q- }5 j, s6 \        MergeSort(arr, start, mid);9 M3 w5 x8 }1 Z1 ?/ Q
            MergeSort(arr, mid + 1, end);
    ) F7 ]" ^% W* s, U8 W        Merge(arr, start, mid, end);
    / S; {' d6 ]( r    }
    ) ^0 S- W( u+ |
    + L; p  t5 I7 @9 j5 h    //合并3 k2 A1 j7 A& l  N1 s$ u4 S" G+ Q8 |
        public static void Merge(int[] arr, int start, int mid, int end) {* C% E- y; P( m  R  |- K
            int[] temp = new int[end - start + 1];
    , K' H, N1 r' L' ?% n5 m: C        int p1 = start;
    . V! f* f1 z3 H; E3 i" L2 _4 h9 U        int p2 = mid + 1;
    5 a0 Z1 M0 d4 I3 K        int p = 0;3 ?5 q( m. Q. i" n/ v  }+ X
            while (p1 <= mid && p2 <= end) {
    / t  C" K$ j) A, g7 ]) T            if (arr[p1] > arr[p2]) {
    8 _9 R7 P7 d) x* h                temp[p++] = arr[p2++];
    7 d& I% {' Y  J; Z            } else {
    ! R0 l; Z/ K' _% |# h                temp[p++] = arr[p1++];/ M; v4 ?! i& U: E( ~
                }/ D" v/ ^5 \% N( \
            }
    6 O! V, g, f' ~+ Q$ G        while (p1 <= mid) {
    8 E, b3 R( A; X2 }& R7 N* y            temp[p++] = arr[p1++];& Q$ n  u; a( V& k
            }
      m( W! a1 K- E; @8 H( F9 w        while (p2 <= end) {
    3 l6 z4 |; i0 C            temp[p++] = arr[p2++];- I& J& x3 v! g& M
            }
    ( a+ J4 I$ n8 @3 p        for (int i = 0; i < temp.length; i++) {
    4 d# O( g3 ]! K            arr[i + start] = temp;% Z7 F  \" g) F3 \+ v: ]  ]3 b
            }
      Q3 o8 w' y4 O* P( Y+ v. O    }( V; y3 V, ^2 ~! e# Q

    $ [9 P1 h7 M3 f2 G% V) \- D    public static void main(String[] args) {
      S% }4 m8 k( X7 o        int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
    ( Z6 n$ `" X# o: h, q) ]        MergeSort(a, 0, a.length - 1);
    6 H* r: ^+ P: M. ~$ O6 D, z) C/ V        System.out.println(Arrays.toString(a));
    3 \9 m1 q: {) _5 }1 o    }
    - G6 O9 I2 t# N# o}
    / n/ s" o0 U4 u5 j7 d; M- n3 _: w, {. y/ D5 v
    # l- H2 Y' d% x- J$ |* W
    运行截图4 A9 X9 f8 H' g  w0 b8 S/ r
    2 {; y8 \3 C7 w3 |3 A) E7 b1 ^
    1.png
    : J( N1 M* h( y" [& _  C, ~8 ]; I
    1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
    $ [/ B! a3 J+ O2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到
    * z; c; j  E% T. d1 Q: L
    9 h$ f$ E7 A% b9 I8 P" b7 }原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035& P& z+ B) @  f8 M0 v
    5 r0 E" S. |  l* m/ ]

    ( `% ?8 C, Z# S+ {8 }/ Y9 S3 J
    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 01:10 , Processed in 0.537637 second(s), 54 queries .

    回顶部