- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566792 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175260
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
6 u$ ]- ]4 d3 c, `
; |2 S1 y( F) U |& Q S
神级基础排序——归并排序 `. @! a2 W+ p5 g1 d0 s. A! X0 ^" x. W) N
. z0 e; ^5 q; Y: [. u9 J* ?' i
归并排序的介绍
+ i# W2 P r* C4 t# p/ ?# V Q
( F" O \* h3 f9 J" [2 V归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
( I4 z: r- U+ \概念
H0 s8 z9 Q" g6 [5 J8 ?5 ?2 a9 m# }3 s: U2 I+ v
是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。' S+ C( {3 `' Y5 T2 \" e
核心思想
; y# o# j. b: W8 S( {6 I& h! A) \$ ^' E" T* H9 m/ D; Q7 b7 g2 ?
将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。, C. o7 ]# E: H- ]5 G! }' P
& p: v" _+ H3 H1 V! ]- Q( F- s0 g8 ~1 [/ R7 ^
实现代码
" `9 r- }. u6 g- Dimport java.util.Arrays;3 Z% }% r) b$ Z/ k8 i* A0 K ^3 \
V# W1 U6 L( H: H; }: ]/*** A* [+ @2 f% p, w
* @Author god-jiang* t) d' A6 K- @$ H
* @date 2020/1/139 e8 T4 Q# v, t5 ~
*/6 c7 h6 Z: D+ _3 r$ B7 \
//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)9 U. f. F: g: J; |8 v, [# t
public class MergeSort {
' } K: m) ^ _/ ]9 O7 f, b& [ public static void MergeSort(int[] arr, int start, int end) {
1 X: I1 B5 R9 A //分治的结束条件* n3 ^) [& r! i* l
if (start >= end) {" |/ a! h4 h, |& f
return;
2 `' S% g, f3 x; p }% A2 Q% N, {# ]2 _4 z) I. A( b
//保证不溢出取start和end的中位数+ l) @# T9 m% ]+ t! x+ S
int mid = start + ((end - start) >> 1);) d' ^+ ^. \2 a7 I: i% Q0 l
//递归排序并且合并7 s% f3 E4 n" y! ^0 Y; v3 j
MergeSort(arr, start, mid);7 e3 f' u" E) K. p7 c$ U
MergeSort(arr, mid + 1, end);
& g% X4 W2 r: a# M9 V0 H5 K a Merge(arr, start, mid, end);. I; }" T, z$ J1 |0 k% N
}5 d1 {( o- ~: i' g- i% f8 w
9 w: A& Z( [! X8 b. p1 x //合并
+ ~# s& K$ i% @0 D4 H6 X) Z& O5 Y: V public static void Merge(int[] arr, int start, int mid, int end) {
/ [+ I" f9 c& }- g* W2 A# ~ } int[] temp = new int[end - start + 1];
" f+ m: E' B1 u3 A, B/ f+ E# G int p1 = start;
6 ~4 |. P/ x. \6 N int p2 = mid + 1;
& g9 `" {, _: E4 T* X7 F* b' u int p = 0;% G h" J+ E' Z( D
while (p1 <= mid && p2 <= end) {
& {3 L" q2 n4 ^# Z if (arr[p1] > arr[p2]) {4 D( X5 B* v6 ]/ i4 O
temp[p++] = arr[p2++];; w. c6 d0 L& Y" n9 k7 c* _
} else {3 m' F) E8 A( [1 n5 x8 r' I
temp[p++] = arr[p1++];4 T5 x: e* {% |2 x! A# |. `
}
+ p( @) D" ?/ X! @5 O) J/ _, x }
+ j/ H- s* m8 ]+ I9 x0 q while (p1 <= mid) {
" K7 \1 K @9 N& E temp[p++] = arr[p1++];+ e- i# @( c% z! ]- L7 w y
}, p( M" K5 I6 C1 M
while (p2 <= end) {
& g) G5 i3 Y/ K& f3 F" _7 o+ O temp[p++] = arr[p2++];% `8 c. y0 C+ W, L* R. ~9 }
}
+ t C6 s: W) {" d- z* ?! C for (int i = 0; i < temp.length; i++) {
; T4 l% H% _9 r/ h/ y6 { arr[i + start] = temp;- @ n0 W. V: k9 b( y2 m1 i
}
. E2 x* e- l" X }! F5 c. Z! m/ V# ~# p2 `# P2 W" N& b
, G S [* ?' \/ r, h2 j public static void main(String[] args) {3 U3 q, |+ m- z; J) Z" d7 I J
int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
( J. k) Y1 @& w) a |& |6 ~" U* W MergeSort(a, 0, a.length - 1);
, W( K/ w' @0 w; C5 h6 M0 O$ ]( I System.out.println(Arrays.toString(a));
' F# v! ?+ ?4 \$ F }9 g/ p0 c$ z; g3 F
}
1 f% a2 A7 I+ z+ ]. Y n& y$ `! g: z, c) w% k2 g9 Z; y3 O, @# X
0 w- c% w1 v8 M: U) i运行截图
0 q6 _ z6 B: p+ z$ L- [/ `4 w
) T0 j' [ I- E0 \9 F3 i( D
) \5 G/ T7 W' X" O; o0 r' V: U. c4 b" r2 R+ N
1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)1 [* I' C: P3 c1 w
2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到
1 ~1 U8 c5 d9 v+ [。
! m! T2 W+ d' M! A5 ^& p原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035
6 w. q( I' y# o9 F H5 t3 N) V) n
) L, F& `) i: i/ a7 l' Z
6 C$ E6 I& u- O% y8 k! H0 X- ] |
zan
|