- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 563402 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174243
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
( R' g# o( ^* o- W8 Y5 W0 E
$ F: M5 b% B4 c/ P0 \$ F$ y
神级基础排序——归并排序
& v1 f5 ~# F- [8 K/ J$ M1 K' \' H6 P T: Y/ \
归并排序的介绍" n6 j2 M3 y% v4 ]6 U; g
F; A1 L/ b9 d3 o归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。& j0 y( ~% M" d8 ~ x3 L
概念
( X0 K3 M& G6 e( [/ Q" Y* x5 A* f0 _) M! N% |2 V. ] U
是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。! _: k9 R* _* q
核心思想1 ^- N* j$ @. N
& V4 ^! M1 T" P
将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。- f/ o. H- j0 T
2 q/ K5 g' c6 C/ v1 d/ y$ M" X% j
3 P* ~1 }. F5 F( m ^4 w: V
实现代码
( y, F' v, w! }3 X- F; Vimport java.util.Arrays;
$ l$ ?* V9 }7 E0 o5 P: J
: o% Z2 q! s8 m" g" O' B {/**
5 Y% l* @# u" l. A * @Author god-jiang1 D# R4 D! o: L( Z+ c; k7 g# h7 Z
* @date 2020/1/13# m4 _; `# o5 H, E! Z( f0 }
*/3 ~+ @6 t3 Y7 G% R
//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
( p) ~" d, g/ T9 S, ~6 Epublic class MergeSort {
" }# o7 |) J' q1 H0 i8 l9 Z public static void MergeSort(int[] arr, int start, int end) {
0 ?3 }! F" Q# p' O- \! ? //分治的结束条件
) n5 i) Z! U3 A if (start >= end) {2 d5 e! h. E9 h( E6 d0 n
return;
3 D! A# Z0 ^+ s( e0 r* w }
: t4 j5 p. w: v W //保证不溢出取start和end的中位数
& x* E" G$ [8 ?7 F; d6 w int mid = start + ((end - start) >> 1);; t4 ?/ s( y0 a( s: y( m% `5 s0 c
//递归排序并且合并
) h3 k- v: n8 ~ k: a- L( E MergeSort(arr, start, mid);7 E9 V* J$ ~7 u& U& \
MergeSort(arr, mid + 1, end);+ w# r. c0 u2 o2 p5 M; ~& j
Merge(arr, start, mid, end);' ]! C2 e0 N* `! Q
}) y, v4 X N; D
/ X+ s3 f' _: @5 k! ~0 Z. w; J
//合并, n2 d8 g+ U3 h3 {0 K! T0 k
public static void Merge(int[] arr, int start, int mid, int end) {
( F+ {0 \; P z# ` int[] temp = new int[end - start + 1];
6 L. }, {5 I/ E6 T% ?: k& m int p1 = start;$ p. H/ T1 Y" g; P. k {% X
int p2 = mid + 1;
! d5 C5 O5 ]* }3 F! v1 p; D int p = 0;
4 k! J) Q0 ^7 w" ]1 n1 b. i while (p1 <= mid && p2 <= end) {
K5 f+ x: X) E) @ if (arr[p1] > arr[p2]) {; \; ^* P7 h6 _- ~: z# r
temp[p++] = arr[p2++];/ g% [# Z+ m" ]& l: Z
} else {0 `: Q# P2 Y2 W& ~/ c! O
temp[p++] = arr[p1++];
7 F" q3 k, B2 U1 f( |1 y; `2 P }+ o( B. I0 p( O ]8 ~& ~6 Z
}* A% r' ?: }; U& w/ a
while (p1 <= mid) {% L; `( Z% f8 e$ M) ^. @8 `2 p
temp[p++] = arr[p1++];3 n4 z2 Z8 S$ [3 P% b
}
/ W0 z E0 z7 X0 [! p$ B while (p2 <= end) {! F. J$ W& V# U- B6 ? r [, Z
temp[p++] = arr[p2++];
& W/ |: N& I' e/ q }
. Y' r8 c8 D3 w# Z. n5 H0 H+ R for (int i = 0; i < temp.length; i++) {0 u5 C; Y) T1 K- Q/ C0 M( n: I
arr[i + start] = temp;
$ A8 `6 [. H" e) Y: ^5 z7 W }
$ r n$ W, ~3 g8 h- c6 } }& K8 {& {; \: s+ z# ~
! w$ `" k/ G; z% {. c X( T3 U9 t6 { public static void main(String[] args) {
9 H; b1 u, c0 D1 G/ Z int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
4 p& w Z8 n( I5 p% x+ _ MergeSort(a, 0, a.length - 1);
* |' n* x9 I, c& Y7 L8 @5 \7 c" @ System.out.println(Arrays.toString(a));" P# [* h3 X% X, h3 ~
}4 k8 D! u( x3 b4 P1 D
}
* ~0 e( s/ J- D' b" n5 P( [: Y
( S9 z a }* B; _. z) r6 L) c( E3 o7 c* x' |# ]. C
运行截图
' C0 W1 M2 H# y+ R, `2 x" ]+ U/ D- B( a2 a/ g
# A3 i+ n8 e* G, k% i
: ~! W0 k" ^2 b3 H- `" N1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
0 |* J# K* `. |: `1 ^) V. u2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到' p) x" K( {/ @6 K$ Z0 l
。
7 m. \! b2 S h8 n7 S) X8 N8 K& H原文链接:https://blog.csdn.net/weixin_37686415/article/details/1051800352 s: Q% v/ } D' t1 z6 P& \
; L( g; \& ]6 `6 x# F; l$ s* l! e1 M, I2 c1 `6 s+ P4 G
|
zan
|