java归并算法之有序数组合并算法实现
归并算法之有序数组合并算法实现
一个简单的有序数组合并算法:写一个函数,传入 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
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。