- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564647 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174617
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
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
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
|