数学建模社区-数学中国
标题:
神级基础排序——归并排序
[打印本页]
作者:
杨利霞
时间:
2020-3-30 17:02
标题:
神级基础排序——归并排序
- U( m5 H; j. Q5 y6 d- r
/ ]. {4 [2 C9 U% U* a- V" e5 {
神级基础排序——归并排序
! v2 b; k; b+ w+ F! E" Z
* D; A& y- _3 i" Y9 Z# X4 T
归并排序的介绍
7 G. w: h7 q0 O$ C% G& @
/ y$ D: e& t( R
归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
. l* _( R! t+ V# K; p
概念
2 V- H. o$ N, }8 D
" q @( O5 E3 D( ^3 u. k
是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。
$ _1 X5 W) C! |
核心思想
1 i: e. ~* k2 J, X( M' o
( b+ z& `) `) G6 ?, D
将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。
, }9 m" S$ ]; T0 j
) G3 `* Z0 L6 d
/ A5 n, R9 s# J8 A: o6 e/ o
实现代码
+ y C* O: r$ F/ B/ Y" m8 n
import java.util.Arrays;
$ U0 Z/ y7 M) f- n
+ v, N2 O( t3 l
/**
7 v0 f7 ?0 z: a6 N4 y7 F; ~9 Z T
*
@Author
god-jiang
, ^1 f1 ~/ c, c" b' r
* @date 2020/1/13
9 Q& Y/ H' `* A. d- [
*/
' P4 f5 v$ E. j, C
//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
7 I, X( _' s- {; o3 W" q W
public class MergeSort {
1 G5 J8 _5 Q P
public static void MergeSort(int[] arr, int start, int end) {
- u+ h( Q! [$ Q2 V9 F
//分治的结束条件
; M/ Q7 [! h1 {, n; u& X# G% d
if (start >= end) {
5 C3 ~" ^" ] N, L
return;
8 L+ d+ ~$ ~3 C4 C' A' S2 n# s. A
}
/ G5 I. y2 s: A3 x& u: ^1 T
//保证不溢出取start和end的中位数
2 A& U- H( C1 N* k7 L
int mid = start + ((end - start) >> 1);
) D$ `' f+ W( h+ ~) Y
//递归排序并且合并
/ M$ t& `. M$ q" _8 f7 m9 Y
MergeSort(arr, start, mid);
& E, p3 t" b( e
MergeSort(arr, mid + 1, end);
; Q9 ^3 K) z' Z
Merge(arr, start, mid, end);
& B# E5 _) R4 K# L5 |& u6 t
}
6 R3 v1 h' u6 T x% f
2 Z! z0 Y5 S7 ~/ i2 B
//合并
( w% u3 L3 ]9 K
public static void Merge(int[] arr, int start, int mid, int end) {
4 o J1 ]7 f, F5 u) w/ k# e; v2 |
int[] temp = new int[end - start + 1];
7 p( q. c, G, R/ |5 g: b
int p1 = start;
) Z' V# L5 f! Z% ^& J
int p2 = mid + 1;
8 k6 @0 o9 U, K1 f4 V/ u( W9 C' D
int p = 0;
* C0 \+ ]( W5 x$ p' o* a' k
while (p1 <= mid && p2 <= end) {
5 T' R0 K1 ]# a7 N' @7 ~
if (arr[p1] > arr[p2]) {
" f2 v8 E% B5 j) l/ u6 G& ^
temp[p++] = arr[p2++];
8 H9 I" L8 P! l
} else {
" A9 A: H; e& ?: [ V i. F
temp[p++] = arr[p1++];
5 g* d: V. |& ~
}
7 U0 A+ ?" S% R( i
}
! v1 s0 `6 m- F1 D/ T" R
while (p1 <= mid) {
+ V$ s) {7 n. S/ B* J
temp[p++] = arr[p1++];
: x/ [8 J4 B4 i
}
7 }! [ D8 e" Z! Q
while (p2 <= end) {
y) l. y, T- T
temp[p++] = arr[p2++];
9 M8 D2 {: N7 Y& ~6 _# A/ {
}
6 `+ Z# i0 E3 B7 Q! {3 N# J. @; d
for (int i = 0; i < temp.length; i++) {
4 Z4 Z* {" ?2 N2 @( p
arr[i + start] = temp
;
/ E* |: \: g- ]8 ]
}
) k+ V0 ~$ G' S9 R. b% E! f* z
}
7 Y6 E7 I! n* q3 D! K
6 v- y: Z7 r; r! u* H% x7 [5 r! e
public static void main(String[] args) {
; l5 s' N1 x8 x1 |, ?
int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
7 ^6 y4 ]8 m7 i( D1 l
MergeSort(a, 0, a.length - 1);
) M/ i1 m. o6 ]# s# Y, p% N/ F0 q4 U
System.out.println(Arrays.toString(a));
- V- e) k. a& K" I
}
( y3 i" ?6 K+ |4 [. b! c* U
}
' `* o/ |6 B) ]1 O5 m& C# L, H
* G# L$ i& k# O" @
# ^' }& \4 a, k& y3 e' A4 W
运行截图
8 v$ I: D- T5 x; v( ~: i
8 L4 B1 f. O: Y* ?4 [( E# h
2020-3-30 17:02 上传
下载附件
(89.18 KB)
5 H# a$ N- m. L: _, @
& L3 M' C& H7 Q# y8 p! K+ G7 W4 b8 g
1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
) v0 v8 c3 v; N7 K
2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到
; `# X( U1 z/ x- B! W+ } ?
。
. |) M3 h6 O; @
原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035
& @" B2 u# [1 y% I/ o% }& `
- n1 h: d! i# D% K' R- q8 \
, K z2 n% E$ N! v' a
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5