归并排序用到了分治策略。
用分治策略解决问题分为三步:分解、解决、合并。也即:将原问题划分成n个规模较小而结构与原问题相似的子问题; 递归地解决这些子问题,然后再合并其结果,得到原问题的解。此处n=2
归并排序的伪代码(来自算法导论)
归并排序实现
一个简单的实现(有待优化)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
#include <stdio.h>
#include <stdlib.h>
#define MAX_INT ~(1<<31)//最大整数
//arr[p,q] arr[q+1,r]
void
merge
(
int
*
arr
,
int
p
,
int
q
,
int
r
)
{
if
(
arr
==
NULL
)
return
;
int
n1
=
q
-
p
+
1
;
int
n2
=
r
-
q
;
int
*
L
=
(
int
*
)
malloc
(
(
n1
+
1
)
*
sizeof
(
int
)
)
;
int
*
R
=
(
int
*
)
malloc
(
(
n2
+
1
)
*
sizeof
(
int
)
)
;
int
i
,
j
;
for
(
i
=
0
;
i
<
n1
;
++
i
)
L
[
i
]
=
arr
[
p
+
i
]
;
for
(
j
=
0
;
j
<
n2
;
++
j
)
R
[
j
]
=
arr
[
q
+
j
+
1
]
;
//哨兵元素赋值
L
[
n1
]
=
MAX_INT
;
R
[
n2
]
=
MAX_INT
;
int
k
;
i
=
0
,
j
=
0
;
for
(
k
=
p
;
k
<=
r
;
++
k
)
{
if
(
L
[
i
]
<=
R
[
j
]
)
arr
[
k
]
=
L
[
i
++
]
;
else
arr
[
k
]
=
R
[
j
++
]
;
}
free
(
L
)
;
free
(
R
)
;
}
void
merge_sort
(
int
*
arr
,
int
p
,
int
r
)
{
if
(
p
<
r
)
{
int
q
=
(
r
+
p
)
/
2
;
merge_sort
(
arr
,
p
,
q
)
;
//分治
merge_sort
(
arr
,
q
+
1
,
r
)
;
merge
(
arr
,
p
,
q
,
r
)
;
//合并结果
}
}
int
main
(
)
{
int
arr
[
8
]
=
{
32
,
3
,
4
,
5
,
6
,
7
,
9
,
106
}
;
merge_sort
(
arr
,
0
,
7
)
;
for
(
int
i
=
0
;
i
<
8
;
i
++
)
{
printf
(
"%d "
,
arr
[
i
]
)
;
}
system
(
"pause"
)
;
}
|