突然想到了这个算法,记得以前看过,但是没写,怕自己会写不出这个算法,于是就把它用JAVA写出来,呵呵。
思想:先依次比较两个数组,按照小的就传入新的数组。当这次比较完之后可能有一个数组的长度很长,留下一些数组,然后在新数组的末尾插入即可。
代码:
1
class
ArraySort
2 {
3 // 两个有序数组的合并函数
4 public static int [] MergeList( int a[], int b[])
5 {
6 int result[];
7 if (checkSort(a) && checkSort(b)) // 检查传入的数组是否是有序的
8 {
9 result = new int [a.length + b.length];
10
11 int i = 0 ,j = 0 ,k = 0 ; // i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组
12
13 while (i < a.length && j < b.length)
14 if (a[i] <= b[j]) {
15 result[k ++ ] = a[i ++ ];
16 } else {
17 result[k ++ ] = b[j ++ ];
18 }
19
20 /* 后面连个while循环是用来保证两个数组比较完之后剩下的一个数组里的元素能顺利传入 */
21 while (i < a.length)
22 result[k ++ ] = a[i ++ ];
23 while (j < b.length)
24 result[k ++ ] = b[j ++ ];
25
26 return result;
27 }
28 else
29 {
30 System.out.print( " 非有序数组,不可排序! " );
31 return null ;
32 }
33 }
34
35 // 检查数组是否是顺序存储的
36 public static boolean checkSort( int a[])
37 {
38 boolean change = true ; // 这个标志位是一种优化程序的方法,可以看看我写的冒泡排序优化就会明白了
39 for ( int i = 0 ; i < a.length - 1 && change; i ++ )
40 {
41 for ( int j = i + 1 ; j < a.length; j ++ )
42 if (a[j - 1 ] > a[j])
43 return false ;
44 else change = false ;
45 }
46 return true ;
47 }
48
49 // 打印函数
50 public static void print( int b[])
51 {
52 for ( int i = 0 ; i < b.length ; i ++ )
53 {
54 System.out.print(b[i] + (i % 10 == 9 ? " \n " : " \t " ));
55 }
56 }
57
58 public static void main(String args[])
59 {
60 int a[] = { 1 , 2 , 2 , 3 , 5 , 6 , 7 , 7 };
61 int b[] = { 1 , 2 , 4 , 5 , 8 , 8 , 9 , 10 , 11 , 12 , 12 , 13 , 14 };
62 int c[] = MergeList(a,b);
63 if (c != null )
64 print(c);
65 else
66 System.out.println( "" );
67 }
68 }
2 {
3 // 两个有序数组的合并函数
4 public static int [] MergeList( int a[], int b[])
5 {
6 int result[];
7 if (checkSort(a) && checkSort(b)) // 检查传入的数组是否是有序的
8 {
9 result = new int [a.length + b.length];
10
11 int i = 0 ,j = 0 ,k = 0 ; // i:用于标示a数组 j:用来标示b数组 k:用来标示传入的数组
12
13 while (i < a.length && j < b.length)
14 if (a[i] <= b[j]) {
15 result[k ++ ] = a[i ++ ];
16 } else {
17 result[k ++ ] = b[j ++ ];
18 }
19
20 /* 后面连个while循环是用来保证两个数组比较完之后剩下的一个数组里的元素能顺利传入 */
21 while (i < a.length)
22 result[k ++ ] = a[i ++ ];
23 while (j < b.length)
24 result[k ++ ] = b[j ++ ];
25
26 return result;
27 }
28 else
29 {
30 System.out.print( " 非有序数组,不可排序! " );
31 return null ;
32 }
33 }
34
35 // 检查数组是否是顺序存储的
36 public static boolean checkSort( int a[])
37 {
38 boolean change = true ; // 这个标志位是一种优化程序的方法,可以看看我写的冒泡排序优化就会明白了
39 for ( int i = 0 ; i < a.length - 1 && change; i ++ )
40 {
41 for ( int j = i + 1 ; j < a.length; j ++ )
42 if (a[j - 1 ] > a[j])
43 return false ;
44 else change = false ;
45 }
46 return true ;
47 }
48
49 // 打印函数
50 public static void print( int b[])
51 {
52 for ( int i = 0 ; i < b.length ; i ++ )
53 {
54 System.out.print(b[i] + (i % 10 == 9 ? " \n " : " \t " ));
55 }
56 }
57
58 public static void main(String args[])
59 {
60 int a[] = { 1 , 2 , 2 , 3 , 5 , 6 , 7 , 7 };
61 int b[] = { 1 , 2 , 4 , 5 , 8 , 8 , 9 , 10 , 11 , 12 , 12 , 13 , 14 };
62 int c[] = MergeList(a,b);
63 if (c != null )
64 print(c);
65 else
66 System.out.println( "" );
67 }
68 }
总结:这个算法应该算是经典的了,一定要记住,这一部分应该是数据结构中的链表中的内容。