- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 566760 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 175251
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
' x7 @2 K, u$ t: D6 `8 F7 g9 \( s
3 s1 N8 }4 _5 ?% w# a
神级基础排序——归并排序
4 j" y- c% F3 G$ i' S5 ~( ?8 O
# e8 J: B1 e2 Q! t+ k1 _; R归并排序的介绍
2 G) e2 S) B, v& L8 }) n3 z
1 ^/ n2 \$ n& v4 d& ~8 b归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。! e2 l+ s, l+ t D% H! z
概念
/ n3 v+ D8 n' p# H
; Y( q0 ?7 w; o/ m是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。
3 r( K. Q9 i0 u' s) `核心思想! _/ u! e# n3 K& V) a
8 v) I6 l1 Z( v. L8 i
将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。
$ p- w5 U1 D8 p8 z5 ~6 L% ^: ?5 p0 X. _) X
. b S" ]3 [( Z$ \1 @& y
实现代码7 H) _0 {; b! ~) I; s
import java.util.Arrays;
3 y6 a. C- O4 h7 N4 i6 `2 y2 t- |4 `8 h M& [6 Z$ l
/**
# J& l' A- r- Q' ^ * @Author god-jiang7 Q% x9 b: V) z! k: c$ b2 A7 {
* @date 2020/1/13
, a- c" E Q: w, ^( n- ?3 r" x8 D */% j! A' d6 g) ~. }) v; X0 S
//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
: R! \8 \/ [. hpublic class MergeSort {, V/ T3 |$ v) M2 ~% M/ y7 T1 h$ U
public static void MergeSort(int[] arr, int start, int end) {, a" C0 f4 K- R
//分治的结束条件
3 a0 x# I( e, E# T# S7 I L if (start >= end) {
" r- a {! R5 Z' m G; |) H return;4 p+ L9 j1 o4 y8 B i
}
* h, G; `* t+ C2 C$ M //保证不溢出取start和end的中位数
+ `9 l6 o' h1 n8 j+ E int mid = start + ((end - start) >> 1);! G) G n& i0 A) s1 L5 G o
//递归排序并且合并' x9 J9 ^5 r6 C$ d( H# g3 O! {
MergeSort(arr, start, mid);( K. T+ G' x! z( w# O4 ~9 A
MergeSort(arr, mid + 1, end);
' f: z: {! _, J5 Y* f9 t Merge(arr, start, mid, end);
$ h! `0 |; a, P: H2 Y$ i }
! w4 c# C2 o9 `; u; Y; Q
; z! ]9 T" s; l5 ?+ F. C# B //合并/ s8 Y6 H1 S/ x, r S/ B0 T( }
public static void Merge(int[] arr, int start, int mid, int end) {' S3 P8 r# w/ x8 R4 [6 }; M
int[] temp = new int[end - start + 1];
( I/ v( f+ v& F1 o" J' T0 f' L' | int p1 = start;$ N) F# j l' r- j
int p2 = mid + 1;
V9 k# G6 [) E0 e: h7 Z int p = 0;) J9 Z3 L" {; p2 W' I4 _
while (p1 <= mid && p2 <= end) {* G# w# m% r* N' e- P8 \$ v2 _
if (arr[p1] > arr[p2]) {! n4 x; s- z: r1 ~8 ]& W$ k
temp[p++] = arr[p2++];8 F6 \0 f& B9 G2 F
} else {
/ U {1 v+ y# ?8 M4 A( G temp[p++] = arr[p1++];
. M. d5 U) o& t {# J, v$ W# E3 t' | }, M7 m+ _, ^0 ]# ]" E# T
}
, y% x+ K) w6 x9 h while (p1 <= mid) {
4 y/ a: d$ k( c- X/ y temp[p++] = arr[p1++];7 Q( N: a2 t$ ^+ j: T6 H) t, q' c
}
( d: u: H, e* l: d/ G; \ while (p2 <= end) {
$ t/ j6 o( `3 M+ o+ h temp[p++] = arr[p2++];# `; `: K* f* O- R6 g. L {3 q
}
7 w- R& a$ _& |3 \( ^- f* m for (int i = 0; i < temp.length; i++) {
! d* P% C' B# T5 a+ Y/ w/ Y' y arr[i + start] = temp;
9 L& `1 e* r9 u7 z) E5 m! e) j3 |; c }) [/ q+ \+ r) X6 n m' J" \
}
2 G' D% M9 F$ \8 S+ g+ |8 b# A9 w0 F' B. @8 W# A2 }
public static void main(String[] args) {! w' C- {# J+ G5 r( U% ?* ]$ Y0 ~+ P
int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
1 s5 g' o, ?; B6 x" c MergeSort(a, 0, a.length - 1);/ P' P9 P8 B; o7 j$ p& c
System.out.println(Arrays.toString(a));. ~- B( o' Y+ S C) N/ a
}# }: b3 g) X* V
}1 ^8 O: K( D8 p( ^8 X+ j2 U
& ~9 ~+ d+ c0 L7 I$ {1 B
6 `: ^+ v- F/ I. E F; y( N! ^
运行截图( p# d0 [1 [+ B6 s9 h8 w
* k! z3 ]/ X. F! O* P2 Z8 O; A
, Y7 ^3 M+ `' [' l5 R( c* P/ b- M3 g) `, S0 F N& n, K
1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N): Z d8 D& G! y& O" B( H
2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到1 v, o/ U2 L! e! X
。* h5 N* o4 f2 F7 D5 w1 e6 V* [7 ^
原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035
; T1 n( v* o7 l* p
2 ~! v$ k& q7 R4 ~/ p6 h9 T! N$ l0 {
|
zan
|