歸併算法之有序數組合並算法實現html
一個簡單的有序數組合並算法:寫一個函數,傳入 2 個有序的整數數組,返回一個有序的整數數組。實現至關簡單,建立一個長度爲這兩個長度之和的數組,而後分別用三個指針指向這三個數組,找到這兩個數組中各個元素在合併數組中的位置並插入,直到某個數組指針到達尾部。再將另外一個數組剩下的全部元素,直接放入歸併數組尾部。算法的簡單實現,須要注意的是對參數的校驗,判斷數組是否有序。 java
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
53
54
55
56
57
58
59
|
public
class
MergeOrderedArray {
public
static
int
[] merge(
int
[] a,
int
[]b){
if
(!isOrderedArray(a)){
System.out.println(
" array a is not an ordered array."
);
return
null
;
}
if
(!isOrderedArray(b)){
System.out.println(
" array b is not an ordered array."
);
return
null
;
}
int
a_len = a.length;
int
b_len = b.length;
int
[] merge =
new
int
[a_len+b_len];
int
i=
0
,j=
0
,k=
0
;
while
(i<a_len&&j<b_len){
if
(a[i]<b[j]){
merge[k++]=a[i++];
}
else
{
merge[k++]=b[j++];
}
}
//A數組所有合併完畢,將b數組剩餘直接加入合併數組
if
(i==a_len){
for
(;j<b_len;j++){
merge[k++]= b[j];
}
}
else
{
for
(;i<a_len;i++){
merge[k++]= a[i];
}
}
return
merge;
}
public
static
boolean
isOrderedArray(
int
[] array){
if
(array==
null
||array.length==
0
){
return
false
;
}
for
(
int
i =
0
;i<array.length-
1
;i++){
if
(array[i]>array[i+
1
]){
return
false
;
}
}
return
true
;
}
public
static
void
main(String[] args) {
int
a [] = {
1
,
2
,
3
,
4
,
5
};
int
b [] = {
2
,
3
,
4
,
5
,
6
,
7
,
8
,
9
};
int
[] merge = merge(a,b);
System.out.println(Arrays.toString(merge));
}
}
|
算法的時間複雜度,取決於待合併的兩個數組的長度,因此是O(M+N),空間複雜度也是O(M+N),即須要的歸併數組的長度是M+N。算法