- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 81
- 收听数
- 1
- 能力
- 120 分
- 体力
- 541085 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 167704
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5324
- 主题
- 5250
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
1 i0 \0 s6 d# G" Z
$ I9 X" d2 R+ _. w神级基础排序——归并排序
( d* N6 ]& T8 F' x6 _6 A1 s, ~, [
' O, k$ V, L" w2 y. R! w: p归并排序的介绍8 g! d9 X4 c- g& l' o
9 E d$ Y& q( b9 K" Q' B4 \+ n
归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。/ O! t9 ], [$ S
概念: O/ E7 _2 H4 F
& \$ G' X2 k5 r7 b7 k$ ~/ t是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。8 V- o8 x! Y3 P3 F7 ~( p6 O
核心思想
1 I! c' i! @, ^" f1 S. V C+ |, ]: W. H! n# b
将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。9 L+ Q l/ ^( l$ Q; z
+ c }* p/ \1 P: R' L
% x# Y0 d' v4 D& A' d
实现代码. T7 p4 E. v7 w4 {( @
import java.util.Arrays;9 \. G9 U5 G3 G. [" B' L1 s' v
& A8 O! H3 y& d/ k- q4 l
/**/ z+ Q. u& x6 M; X9 C8 @
* @Author god-jiang- A- f- M% F( T4 W
* @date 2020/1/13! {4 w4 j5 I ?9 y- Z7 N8 O
*/7 z) v5 u$ f! ?. W2 ?
//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
( V8 w: [4 R8 Ypublic class MergeSort {
, Y% v! w9 ^- C3 r0 h public static void MergeSort(int[] arr, int start, int end) {( _. _$ w; N2 }+ S; Q
//分治的结束条件
# V9 m. K, K, q: N3 E4 _7 E& g' X$ p if (start >= end) {) S6 ]& ] o: ?' |3 _
return;6 `2 y2 ~% V6 c4 q
}
" f) L7 x) j7 H# R+ } //保证不溢出取start和end的中位数! U. Y( Y- w* I6 y! L# B
int mid = start + ((end - start) >> 1);
9 f- K- G# c7 \$ G! z5 o/ o0 u //递归排序并且合并9 O w% |# u5 W
MergeSort(arr, start, mid);
, V0 q$ T- y O; V( l# A" t2 A MergeSort(arr, mid + 1, end);# u. p* r, x3 ?3 M5 q/ a) L
Merge(arr, start, mid, end); @# |. X5 D& k8 ]( O( t7 }
}3 K! J' r4 N$ n$ B4 I
9 H! m1 |2 d8 i4 A' L; o7 n; ] //合并5 G- r8 X) `% h
public static void Merge(int[] arr, int start, int mid, int end) {4 V' Q( t, j9 M1 q
int[] temp = new int[end - start + 1];# j6 E9 j) L: s
int p1 = start;
1 M- H7 j0 e9 b( H* u* b( L int p2 = mid + 1;5 g/ @/ j* Y k9 i \7 m- a$ t
int p = 0;
2 x9 a# O2 q( N+ ? while (p1 <= mid && p2 <= end) {
+ \, a, @; |" y" G% Q if (arr[p1] > arr[p2]) {
3 }( r7 g1 d: S" V" t2 m, V temp[p++] = arr[p2++];
: @$ v# M0 f# C* Z; W% w: I } else {
* a8 n2 {+ G$ X- h3 U temp[p++] = arr[p1++];' k8 G5 \+ m% U5 V! N6 S2 Z! {4 [
}/ @3 `- Q3 _! q: |" T5 P. G
}/ p# \0 q# H: T+ k2 F; I8 I9 U
while (p1 <= mid) {
! Y$ f* o5 |! h: i/ `( O' D temp[p++] = arr[p1++];% f- M$ _. N$ R. Z* J
}
. K/ T' W+ N8 r while (p2 <= end) {
/ o: {+ l; s' a temp[p++] = arr[p2++];
5 j- U1 M+ {0 p, L% U# [ }
, s' x n1 ]5 i- G for (int i = 0; i < temp.length; i++) {
$ F; }1 v+ U, e! B- ~& K arr[i + start] = temp;0 K* K J' E9 K4 O7 r) z; D
}1 N* x# U: H4 y3 q* V! x* v. M! `
}7 S1 A+ I# m: l
( R0 R; P' G$ r% w/ N public static void main(String[] args) {
; y1 t2 n+ ^: U0 p. V int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
6 e7 M0 G8 {5 r" d" G+ l9 J+ Y MergeSort(a, 0, a.length - 1);
( a- o) T& X2 ]1 ]1 F# }* X) n7 t5 U System.out.println(Arrays.toString(a));0 o$ P! m5 Y8 I8 k9 F
}3 h3 ^9 ?$ L; m( C. V
}
* Z8 m! u0 J5 _5 ?5 L, B. \' ~: M0 |5 ~, d3 g! Z& V' k
a# v5 _: p9 x. J6 i
运行截图2 {# Z% i9 s+ Y8 S
! E2 a& M. t/ h3 @0 C
( M7 z( n$ ^: `5 s/ q
/ [6 i M$ A/ H# n! q5 Q; k3 C1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
5 c( o( S& A1 G& i: g/ Z7 r- i2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到; X' ]: Q; k# W
。
- W4 ~& E6 j* }& U( m: {& {原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035. b! W! O# X) a8 ?" k
9 P% o" m% Y( D
+ i& k* z! p+ l3 L5 j5 {: l2 A
|
zan
|