- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 565537 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174884
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
: b5 O N) \, y: k2 n* y+ r* r. k+ `/ W( R5 m- d& Z# _
神级基础排序——归并排序# x1 j! Q% F" l, \
* K+ g7 U+ @ E5 c- S归并排序的介绍
/ k$ Q9 s ?# q
9 C+ i8 p2 Q6 N5 [$ j归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
3 C- e% e' e& J, J6 x概念
4 q( r0 W8 w* }3 ~5 e
5 U( K- W T0 o8 A+ r7 X是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。( p! k' C& @" q/ o
核心思想' E0 |6 k3 G" a0 O, Q1 l
) x* o0 b1 H" k) g7 f将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。. Y9 w# I& U* _5 n0 w% A
5 }* e% o- P( }' p/ _
/ s5 X* ]/ t. @" |$ B b/ G实现代码
7 Z3 Q- K# `/ @! \$ w! i& aimport java.util.Arrays;/ m5 {( m9 X# [$ h$ d" p
- x: g \5 Y' o) S) @% o/**
! }9 ], ?& R# m; t L7 X- P * @Author god-jiang$ k3 I" N. M4 b! A
* @date 2020/1/13
1 K' F1 A. B9 T2 s; f */; D4 Y" A6 C* `6 p/ f
//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
& [) j- F# c- }7 }public class MergeSort {3 o Y8 @& x& z) t2 u# G
public static void MergeSort(int[] arr, int start, int end) {
3 h$ \6 s- H+ C7 s; z0 X //分治的结束条件
P, M5 x8 l; B3 y+ N8 X- T) } if (start >= end) {
% F$ K; T: e2 o- [5 Y return;2 r% }. |; I2 |# n4 {4 F% ]
}0 m* v+ C$ z M% M8 d0 }) ~
//保证不溢出取start和end的中位数! e7 e& G& Q( U0 i( B! V" u3 T
int mid = start + ((end - start) >> 1);, `' E1 b8 F# R6 ?7 O5 j& f0 {. B
//递归排序并且合并
7 O# P+ Q: P& P; Q- }5 j, s6 \ MergeSort(arr, start, mid);9 M3 w5 x8 }1 Z1 ?/ Q
MergeSort(arr, mid + 1, end);
) F7 ]" ^% W* s, U8 W Merge(arr, start, mid, end);
/ S; {' d6 ]( r }
) ^0 S- W( u+ |
+ L; p t5 I7 @9 j5 h //合并3 k2 A1 j7 A& l N1 s$ u4 S" G+ Q8 |
public static void Merge(int[] arr, int start, int mid, int end) {* C% E- y; P( m R |- K
int[] temp = new int[end - start + 1];
, K' H, N1 r' L' ?% n5 m: C int p1 = start;
. V! f* f1 z3 H; E3 i" L2 _4 h9 U int p2 = mid + 1;
5 a0 Z1 M0 d4 I3 K int p = 0;3 ?5 q( m. Q. i" n/ v }+ X
while (p1 <= mid && p2 <= end) {
/ t C" K$ j) A, g7 ]) T if (arr[p1] > arr[p2]) {
8 _9 R7 P7 d) x* h temp[p++] = arr[p2++];
7 d& I% {' Y J; Z } else {
! R0 l; Z/ K' _% |# h temp[p++] = arr[p1++];/ M; v4 ?! i& U: E( ~
}/ D" v/ ^5 \% N( \
}
6 O! V, g, f' ~+ Q$ G while (p1 <= mid) {
8 E, b3 R( A; X2 }& R7 N* y temp[p++] = arr[p1++];& Q$ n u; a( V& k
}
m( W! a1 K- E; @8 H( F9 w while (p2 <= end) {
3 l6 z4 |; i0 C temp[p++] = arr[p2++];- I& J& x3 v! g& M
}
( a+ J4 I$ n8 @3 p for (int i = 0; i < temp.length; i++) {
4 d# O( g3 ]! K arr[i + start] = temp;% Z7 F \" g) F3 \+ v: ] ]3 b
}
Q3 o8 w' y4 O* P( Y+ v. O }( V; y3 V, ^2 ~! e# Q
$ [9 P1 h7 M3 f2 G% V) \- D public static void main(String[] args) {
S% }4 m8 k( X7 o int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
( Z6 n$ `" X# o: h, q) ] MergeSort(a, 0, a.length - 1);
6 H* r: ^+ P: M. ~$ O6 D, z) C/ V System.out.println(Arrays.toString(a));
3 \9 m1 q: {) _5 }1 o }
- G6 O9 I2 t# N# o}
/ n/ s" o0 U4 u5 j7 d; M- n3 _: w, {. y/ D5 v
# l- H2 Y' d% x- J$ |* W
运行截图4 A9 X9 f8 H' g w0 b8 S/ r
2 {; y8 \3 C7 w3 |3 A) E7 b1 ^
: J( N1 M* h( y" [& _ C, ~8 ]; I
1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
$ [/ B! a3 J+ O2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到
* z; c; j E% T. d1 Q: L。
9 h$ f$ E7 A% b9 I8 P" b7 }原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035& P& z+ B) @ f8 M0 v
5 r0 E" S. | l* m/ ]
( `% ?8 C, Z# S+ {8 }/ Y9 S3 J |
zan
|