- 在线时间
- 1630 小时
- 最后登录
- 2024-1-29
- 注册时间
- 2017-5-16
- 听众数
- 82
- 收听数
- 1
- 能力
- 120 分
- 体力
- 555537 点
- 威望
- 12 点
- 阅读权限
- 255
- 积分
- 172034
- 相册
- 1
- 日志
- 0
- 记录
- 0
- 帖子
- 5313
- 主题
- 5273
- 精华
- 18
- 分享
- 0
- 好友
- 163
TA的每日心情 | 开心 2021-8-11 17:59 |
---|
签到天数: 17 天 [LV.4]偶尔看看III 网络挑战赛参赛者 网络挑战赛参赛者 - 自我介绍
- 本人女,毕业于内蒙古科技大学,担任文职专业,毕业专业英语。
 群组: 2018美赛大象算法课程 群组: 2018美赛护航培训课程 群组: 2019年 数学中国站长建 群组: 2019年数据分析师课程 群组: 2018年大象老师国赛优 |
0 Q# Z$ Y% z& E" b. Y
& _% z m9 O. S神级基础排序——归并排序: D) b2 l4 o* l- m9 f: j
% M- n) m! w# r# w& {# E归并排序的介绍+ l0 _2 c0 O0 [
+ O- g* d2 H, g1 O& j2 n( G" `
归并排序(英语:Merge sort,或Mergesort),是创建在归并操作上的一种有效的排序算法,其时间复杂度为O(N*logN)。1945年由约翰·冯·诺伊曼首次提出。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用,且各层分治递归可以同时进行。
; U* A6 T- ]* x% R9 q1 G概念
& e# {* t' i, I* D% k3 Y
3 R- [) o% X5 w# a是利用递归与分治的技术将数据序列划分为越来越小的半子表,再对半子表排序,最后再用递归方法将排好序的半子表合并成越来越大的有序序列。
3 O) ?; O- s2 A- C- P; u- m核心思想# _' s9 T9 U# j$ I' p
" @2 V4 q$ }5 E/ C/ L将两个有序的数列合并成一个大的有序的序列。通过递归,层层合并,即为归并。 Q6 G. O6 h; q9 a9 x( ~: b8 P- G: I
8 R3 Y. o& F: B z# P M% k ~
; Q! C6 K7 J+ l1 @实现代码
4 ^9 N7 g& b5 L, k5 j* _1 yimport java.util.Arrays;
. j4 @& _; }# g* X6 Y8 J/ E8 k. T- e9 j, i9 W* B3 X- h
/**
' }8 N& k5 S. B7 E. R. m: }7 q+ t * @Author god-jiang, ]; F" n* m9 u3 k
* @date 2020/1/13
: E( [% r, V P, k( p3 A$ ^% M */
( A3 x6 L% {# v//归并排序,时间复杂度为O(N*logN),空间复杂度为O(N). Y c' o- P+ s! K" k0 e; m
public class MergeSort {
% q, s7 w! L6 _# M9 ~ public static void MergeSort(int[] arr, int start, int end) {
; ~2 F" o |% a1 e# m/ ]- X //分治的结束条件
: ]+ p; q: v; Y) f( z/ X if (start >= end) {6 i, x( |+ x( u% c1 M6 h
return;+ ^1 Z9 ?+ @. N# a1 L
}4 Q7 J+ G' \) s5 w* ~1 j. R" m5 I* y
//保证不溢出取start和end的中位数
% i! w7 h5 Q4 a0 | int mid = start + ((end - start) >> 1);
" Z( H$ _* P9 H. M //递归排序并且合并
3 t5 i4 }- @* A% H. a h9 C MergeSort(arr, start, mid);" j# F, N @ T+ P
MergeSort(arr, mid + 1, end);
# \$ M- A9 j/ Y6 L) | Merge(arr, start, mid, end);
! }4 k$ l7 A1 ~( }7 ` }( q6 g: }7 l/ l$ \' a0 {
+ w: u1 S0 a) W* N //合并
0 [# r: K3 d0 y3 J2 x* t public static void Merge(int[] arr, int start, int mid, int end) {1 L8 r6 V% F+ N) ~0 Y5 X/ {* `
int[] temp = new int[end - start + 1];: T5 q- [/ ^" a; l- c
int p1 = start;
4 L4 M% T- ]6 ]& V" y* F int p2 = mid + 1;
7 H& y& P% @) M int p = 0;1 h. N- u3 v9 F. k: l( H2 S) D% Y
while (p1 <= mid && p2 <= end) {
* M( u8 w* b6 x& `6 C( o; J5 M if (arr[p1] > arr[p2]) {$ L, U; w6 W! ^- _% x
temp[p++] = arr[p2++];# ]6 v6 ~7 P9 t# u0 ]- ^
} else {) |- `; x! U# u) Q; J
temp[p++] = arr[p1++];
' _# K ~, p' S" x. y3 C; [ }% h9 b3 x4 }% u; i3 p t; P( z
}
% y; X' y" t- q while (p1 <= mid) {
8 \# S3 e2 b$ H8 z! ~- ~2 Y4 o4 |- x temp[p++] = arr[p1++];
/ N4 g# r% W( w) ` }
& _! Z* j3 x+ r! o; W while (p2 <= end) {2 k8 V! U& ~- {' e
temp[p++] = arr[p2++];
3 ?7 F' O5 o3 ]8 [ }( Y; o& w% t4 Q) [9 N
for (int i = 0; i < temp.length; i++) {
* |* Q3 v L. g! R6 ~$ G arr[i + start] = temp;% U m4 ~9 d# b
}
; n0 }6 {! I) \+ p, J- Y9 K }
2 n2 C! ^# I& `" ~3 X6 {1 S( q+ _) A
public static void main(String[] args) {
9 T+ Q9 C8 u0 Z+ h2 {9 V. o5 S int[] a = {2, 4, 6, 1, 3, 7, 9, 8, 5};
' {/ U, [; ^. m MergeSort(a, 0, a.length - 1);
E9 k+ D& L2 V- { System.out.println(Arrays.toString(a));
) V2 O, h7 S6 E3 P7 I# t w" r3 I }5 I+ q0 y+ y8 X/ e; g7 N
}! W4 ~6 z6 w+ y
T9 ]1 H1 k4 H$ [$ N% A+ o7 n* f- c0 F. n
运行截图
, P$ I8 d# Y3 F4 C2 J5 V9 |5 g `4 R" J; J% g) R
' Y1 Z, f7 n O- X9 U$ ]: ~
3 [/ F8 q& Q4 l3 G
1、以上就是今天分享的归并排序,时间复杂度为O(N*logN),空间复杂度为O(N). j: n' r$ g6 q1 ~5 O7 S7 ~+ F
2、归并排序的额外空间复杂度可以做到O(1),但是非常难,不需要掌握,有一篇论文”归并排序内部缓存法”可以做到/ R* x7 a5 s. @6 s
。
- a) b: @" w X原文链接:https://blog.csdn.net/weixin_37686415/article/details/105180035 Q/ ], r! |) K7 g4 X
0 N# k# N% y/ h- t4 G, Y
8 |% h5 ^5 _7 a" M |
zan
|