QQ登录

只需要一步,快速开始

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

    ; t" K. ]2 `8 X) [1 Y( y8 g: O+ u" a1 n8 [1 {+ {: I% l
    神级基础排序——归并排序
    4 h0 v4 |$ U' O" `$ y3 u* O2 |, i! l
    归并排序的介绍
    - F# w  ?6 V. o2 m4 ^8 ]' S
    ! ?9 O& w  ]' g( o归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
    $ g  c& y. U. h8 B* H! X概念1 A4 d, A; u. g+ [: |( {1 u

    & _# K9 M7 r( r1 {$ J是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。  Q! J6 L6 t, i2 p! ]
    核心思想
    . l+ d: v* d! ~9 z9 c  ]4 g4 B& E, a4 \) b' V
    将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。4 y/ S8 }% \% }8 G% ?- V
    6 F( D, J4 e1 J2 H" K. p; @) c

    ( i; i4 F- g* f  `% O! f  Q实现代码( y# z5 a* z8 X* j2 A) |( ]5 ^) z
    import java.util.Arrays;! j/ P  t& U( f3 x

    * L6 G" B/ J0 R2 @& j7 S/**
    " j! S8 U- H4 G! N7 i * @Author god-jiang# @7 R9 q9 W+ w  I& V+ ?9 [+ p
    * @date 2020/1/13% i) K- S0 g- X/ \1 T& a
    */
    3 ?7 ^0 w- F+ p' q, \& ?# E  g//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)5 `; k  Q8 O" w" E- L
    public class MergeSort {9 t# D% H) t( w9 D* q7 {
        public static void MergeSort(int[] arr, int start, int end) {) k7 d2 q3 M! \  i) _% P1 g
            //分治的结束条件
    6 [0 h% _! D; c4 q& @" Y        if (start >= end) {% P6 u/ H7 S6 b% n  D
                return;
    8 o7 [& `6 X' n$ B) k        }% h* P' v. `  [% h! t
            //保证不溢出取start和end的中位数3 A& V+ b! I& U9 ~. N7 _! d
            int mid = start + ((end - start) >> 1);
    & X! q% w2 B- q" y8 s& t; Q        //递归排序并且合并
    3 m# r1 p# P+ u0 q  ?* f        MergeSort(arr, start, mid);
    ' N8 b# H: d- K1 a' T7 [1 d        MergeSort(arr, mid + 1, end);
    ' _2 N; Z  F  `: n  c. c8 \        Merge(arr, start, mid, end);
    7 Q: r0 B5 ?: D& a% b! T    }* A; `/ ?* s0 k0 U! b& v/ Q

    % e5 A, ?. j1 X+ s: w  M0 i! @    //合并
    ( T, V! Q. @5 N" W% `. d6 L5 c    public static void Merge(int[] arr, int start, int mid, int end) {" X; x) i6 j7 |: Y# a* G8 B7 Q
            int[] temp = new int[end - start + 1];- F9 ^6 t8 O4 E* ?; o& w
            int p1 = start;
    8 \: O2 v5 l( [) a! e. E3 y        int p2 = mid + 1;
    3 ~  f: V: h5 v. |5 h        int p = 0;
    9 s9 r& W5 d% ]' l$ x3 h        while (p1 <= mid && p2 <= end) {
    1 f( |4 D9 H/ H/ F# ~( N            if (arr[p1] > arr[p2]) {! @7 d0 a7 ?: S( T
                    temp[p++] = arr[p2++];
    9 }! @/ ?# \8 x9 z            } else {! h3 }6 }% S, w  w9 N
                    temp[p++] = arr[p1++];
    1 z8 O$ j2 u; X" _; H! J, g0 Y            }. p% E0 l" s: ~8 L3 y" Q; t
            }7 G- M+ v+ l/ ?, L* m. ]
            while (p1 <= mid) {; k( i( c% z# d5 B9 J* N
                temp[p++] = arr[p1++];
    6 S+ s- `9 i1 e6 U9 f        }% R' L. r( i0 {( J
            while (p2 <= end) {
    ( l- A* m2 D$ v9 C" x3 |            temp[p++] = arr[p2++];
    9 Y0 r7 X  S  Q9 N; L& p1 U        }3 `0 C, L: e5 Y- t3 [
            for (int i = 0; i < temp.length; i++) {& y7 o" ]4 y9 z, D+ m5 c
                arr[i + start] = temp;
    7 w2 A7 @5 x9 G8 X, j        }2 W2 ^' L, Y# v8 r% Q5 G. a
        }
    # A. Q& m% P; x/ ^  h* l" O6 ]3 ]: a7 D* `1 t2 T9 L
        public static void main(String[] args) {
    : k% E, M  Q/ T" m+ ~0 T7 e        int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};! T) ]  m( b8 I$ e# X$ w
            MergeSort(a, 0, a.length - 1);/ {0 K+ p( G2 l
            System.out.println(Arrays.toString(a));) e! p9 o* c4 s8 e1 [
        }
    ' @, [3 |3 r( w! _+ L0 S}7 w( p9 Q/ w& f% B* z6 v4 m/ q6 f
    " p$ G4 h  |* [" X
    3 ^- O2 E. w! h& n3 \5 k" I) M% b
    运行截图
    ( e" x+ R) A5 y% h" ~, z$ a$ A
    5 w1 I! t% e0 [) Y7 C 1.png
    % `% _7 I% |. R$ Q4 A: v9 O' a  F/ P/ o  L4 v
    1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
    $ g! Y& s4 w. R, h: U' A2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到
    * ?- U% G! _2 q
    ) |7 `; M9 ~4 ]; C3 J原文链接:https://blog.csdn.net/weixin_37686415/article/details/1051800358 s, l6 d$ L. W; W
    . M5 [$ ~% x  v* e

    4 D, D. G7 o7 B/ `% A1 s
    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-15 18:24 , Processed in 0.422300 second(s), 54 queries .

    回顶部