- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 564652 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 174618
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 3
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
|---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
. F' [5 m8 [, @2 m8 H
; l Q4 I6 x7 Z: {7 Y神级基础排序——归并排序' x+ g- k$ M# N7 y
2 `( \" q# e+ U* \9 q. G3 M
归并排序的介绍+ A& J. r+ K0 H! Z0 `8 R
" e8 P+ E7 U' s$ ?7 [, X" Z
归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。5 a, [/ @4 p+ g0 Y
概念. N9 u8 K# ~. F# z
* S% M/ H, f: A是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。
* {/ ~3 G$ m0 @# u& E1 ]核心思想$ k' O9 R, b+ e: j" ?$ d
/ j- K, J8 w( O4 w将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。! L8 y/ a7 d& g" y, K0 \' h
/ }$ V7 Y `: E# K0 P% v
7 G3 C g9 v( _" e" S实现代码0 R1 h0 c+ ~5 @/ H
import java.util.Arrays;7 N E8 m2 L$ ]0 t$ r# A0 ]
8 C0 s1 u a8 m1 X) p/** w* R" l. E: F
* @Author god-jiang6 Q: [( ?, Z1 d2 z8 D v3 G
* @date 2020/1/13
, R0 c) A7 m4 m% [8 _' c */
( n* g5 w6 S/ I1 I//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)
, x+ ?% \1 r7 U. j! fpublic class MergeSort {$ r0 A! S$ c2 G3 s8 D1 Q
public static void MergeSort(int[] arr, int start, int end) {) C8 o4 ]9 x# c* E# Z
//分治的结束条件
& k9 V% i3 d5 U if (start >= end) {
% e; }0 C% v/ I0 b# ~" }; P return;; ^4 x; H- j+ X' Q. O1 ^" a
}: p( V: x8 h, O1 r: L' T2 y
//保证不溢出取start和end的中位数+ Z$ I, M( [5 E# i3 Y8 T! |
int mid = start + ((end - start) >> 1);
: m6 W8 ~* G9 t, W //递归排序并且合并
& z* H& z4 w% S. O6 | MergeSort(arr, start, mid);1 s1 T% o' s% Q- M# n& E* Z
MergeSort(arr, mid + 1, end);
3 i: P: c6 c `0 w6 |0 @9 q! Q Merge(arr, start, mid, end);
1 T( Z" `( e+ D) j0 n7 t }
5 r6 ~2 ]8 n3 N( t* d& h% M, q6 J) v' n- R- t: A% P
//合并/ n/ |% t6 z2 U: {/ T6 Y5 R- P
public static void Merge(int[] arr, int start, int mid, int end) {* t/ ?+ ^0 s9 {3 M5 [
int[] temp = new int[end - start + 1];" Y9 U/ C3 E7 w) N9 E- ^- t% F$ M( _+ [
int p1 = start;
% X- Q6 l9 Q5 h+ S# x int p2 = mid + 1;9 q) ]( B8 g8 I: z
int p = 0;. e4 {) r r6 T" b4 C
while (p1 <= mid && p2 <= end) {2 H7 M/ G2 y3 \: }) v# _
if (arr[p1] > arr[p2]) {; h; A- U& Y* I/ `( c
temp[p++] = arr[p2++];
. Q% P2 k* M7 B } else {1 v7 `& _: [% Z/ S2 t( Y
temp[p++] = arr[p1++];! {: }( W+ t. _# U& j
}
, b' \ _& |/ s5 m+ P6 D. l( ` }5 ^. l& t& Z J5 R
while (p1 <= mid) {
- S4 T: \# r, {. D2 c1 f temp[p++] = arr[p1++];
7 ?9 I) d- ~# i7 k }' a. F% y& M. ?
while (p2 <= end) {
' l- h; A7 u7 A, y3 ]6 X5 T temp[p++] = arr[p2++];1 x* V* i# D% V1 h' t' ~2 B
}6 R/ L# M! q E
for (int i = 0; i < temp.length; i++) {$ Z, m$ w/ G; U
arr[i + start] = temp;
7 P) i5 v J" u R3 w7 ~ }0 T+ o8 d1 r _; |0 \2 |
}
. ^1 d% Z: |# t4 t( F/ k* a6 ~4 P0 z; ~2 G; @8 m. i
public static void main(String[] args) {
2 T7 i/ c6 p( n4 z int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
' ~ w) E! I4 ^- @5 f9 x5 ? MergeSort(a, 0, a.length - 1);
0 m) [# R7 V! W4 ?$ x System.out.println(Arrays.toString(a));4 ^$ M1 r: H$ G+ H4 G/ C3 x' I
}
: N S$ ]7 A& T}- O9 o) z0 l& k. Z$ n) D" ~9 M
4 T; j0 q$ V5 J, f$ M' W; y3 G+ i: J5 V7 k) d+ s7 z, R; U! c
运行截图
; ~% h0 e! X( s& m1 ~$ Z! w4 }. c9 D0 X/ L/ F
3 h% P! q, H/ w/ k( t' J1 ]
* [2 t' O) d7 [5 V: s; e' Z/ t1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N)% u# n$ H9 z' r$ D1 f, {
2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到
$ E7 |' [: f$ i/ Y# R: V3 d% q。, _% a, H y( D* [; l: b! s
原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035' D! L. Q7 l, R# j% h! @
" ]2 i5 G$ { M7 T- M6 L7 V* \8 ]9 b( ?
|
zan
|