- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566772 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175254
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
" s- r7 [/ {& p$ N
! M+ z! Z8 A6 S6 ?6 l
神级基础排序——归并排序0 g h. w0 h! p: U- i* Y0 W3 X
H; ]" i$ b- e1 v8 J! O
归并排序的介绍
7 N! Q Y* p* _0 } M! `. P3 v! z
归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。, A' U; W4 `2 K5 c) A1 x
概念
; R) Y$ h7 c4 I$ @& k8 x. u8 O* V. x' N% {+ U
是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。- m6 d4 F! Q/ K9 d
核心思想
# I7 |5 D1 G( u
. p) o4 O7 z+ \* W' w( u0 {将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。
) [0 X2 F9 N! s3 m5 p5 I, {0 s/ e
5 H8 D# J5 I6 H# F* t, H0 D
实现代码7 H9 B) s1 D$ p4 g. l2 e6 y
import java.util.Arrays;# @" [, b9 A2 f4 D
" c) q" T0 U0 }/**0 e1 |. Q0 i9 k3 ^% z7 u
* @Author god-jiang: S& ]- ~) _! B, p; A6 z' c0 E
* @date 2020/1/137 U- r# f& \* z
*/
5 o3 w: o4 t, V: j//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
& x9 |4 y. u6 c5 zpublic class MergeSort {
1 {' g$ E7 x4 m+ \0 }, Z public static void MergeSort(int[] arr, int start, int end) {0 c* L+ v8 Z1 r# p) @$ \
//分治的结束条件( v. u3 G2 W& k9 o( a
if (start >= end) {
& J# I; L9 g r6 X8 i return;
0 T' E1 r5 i. Z }
6 ?; b$ ~) O- D, R5 Q //保证不溢出取start和end的中位数
$ W% B+ ~, T k* c3 C int mid = start + ((end - start) >> 1);
2 t- v- \& ?# o, R: _& ] //递归排序并且合并$ D( G9 D. W+ q5 u' a
MergeSort(arr, start, mid);8 P4 A4 B$ x* b5 I
MergeSort(arr, mid + 1, end);+ ]+ ^$ _ z: f2 E
Merge(arr, start, mid, end); A7 m/ s% ~+ N6 J
} X9 I$ i6 i, R
5 d+ h6 Q' w7 w! G; J7 y3 L- a
//合并( J* y/ c1 @5 ~; U
public static void Merge(int[] arr, int start, int mid, int end) {
4 o3 X3 ]) f0 A3 H9 K int[] temp = new int[end - start + 1];
/ Y; B3 |- ?3 ^) o i, t int p1 = start;, {! u) Q. @8 `' I/ V, s" m
int p2 = mid + 1;) B6 C" d% [& x6 S! K9 A2 w% s" q
int p = 0;
# K* Q7 C, B4 E4 _2 A% C while (p1 <= mid && p2 <= end) {
7 L; M$ U T8 M7 W8 W0 G. A& S- d* X if (arr[p1] > arr[p2]) {
& L% u' }# n. b( L# y. e5 J' Y3 { temp[p++] = arr[p2++];/ b" u @1 N& g. k$ f
} else {; }" ~; Y5 }( M0 v& {; i; G
temp[p++] = arr[p1++];9 v, u0 m2 M; U9 [' q+ @% }
}" p z: |+ y* D( V1 A1 W3 g( J
}
& D. u: `" y9 @( q- M% a, S while (p1 <= mid) {
- Z7 a) O! z) H$ t$ p8 g; W temp[p++] = arr[p1++];( u& i; P& m- ?( G% p2 _7 }1 L
}
( Z6 p+ b ^3 Z1 Y" A3 e while (p2 <= end) {- C7 @% M& t$ k# R6 H; g
temp[p++] = arr[p2++];( e0 i7 r9 E& }6 r3 J$ C9 U. C5 K
}
7 N% c9 o* R' b for (int i = 0; i < temp.length; i++) {
8 ~4 J( g, K, X0 c arr[i + start] = temp;
: {+ R; i8 P+ N- j# [. j5 _2 ` }
J% t, E) Y% u7 l5 R }: ?9 ]. O- G0 M8 t7 r0 ~# o `7 U
1 C. p8 P3 H! K/ ~3 t7 {6 t3 G public static void main(String[] args) {
( |+ W2 G }2 j int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
7 i3 s/ h2 F5 h u; |& W MergeSort(a, 0, a.length - 1);2 Z, z' E% I+ Z [; S* N
System.out.println(Arrays.toString(a));0 N# _# M$ ]2 o. V
}0 w7 S* H4 W- B) j
}1 D4 w# W) w2 m0 Z8 N, m- p
9 e% f# l. D# i+ ?9 `: J* h6 E
; H) O0 k' @% N2 Z运行截图: Q9 M9 P3 T2 G. f9 R7 p f
g4 z8 Z5 x9 o4 X" }" M
1 d5 L' R- Z- k5 R! n- [4 e
+ Q3 w& G; E3 b4 ]
1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)* C' k3 ^; n& _2 B/ q
2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到 ~; O- f) n$ V
。
/ d8 K3 h4 a8 j5 G原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035
5 T/ k* l" o$ F6 C
; c# J+ c% M$ D$ j4 r: m( V& u/ C+ B4 h
|
zan
|