归并算法: 要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。
时间复杂度为 O(NlogN) ,空间复杂度为 O(n)
1 public class Merge {
2
3 private static int[] copy;
4
5 public static void sort(int[] array){
6 copy = new int[array.length];
7 sort(array, 0, array.length -1);
8 }
9
10 private static void sort(int[] array, int start, int end) {
11 //将数组排序
12 if(end <= start) return;
13 int mid = start + (end - start) /2;
14 sort(array, start, mid); //将左边数组排序
15 sort(array, mid + 1, end);//将右边的数组排序
16 merge(array, start, mid, end);//归并方法
17 }
18
19 /**
20 * 排序
21 * @param array 需要排序的数组
22 * @param start 数组的起始位置
23 * @param mid 数组的中间位置
24 * @param end 数组的结束位置
25 */
26 private static void merge(int[] array, int start, int mid, int end) {
27 int i = start, j = mid+1;
28 for(int k = start; k <= end; k++){ //复制数组
29 copy[k] = array[k];
30 }
31
32 for(int k = start; k <= end; k++){
33 if(i > mid) array[k] = copy[j++]; //当只剩下右边数组
34 else if (j > end) array[k] = copy[i++]; //当只剩下左边数组
35 else if (copy[i] <= copy[j]) array[k] = copy[i++];
36 else array[k] = copy[j++];
37 }
38 }
39 }
测试代码:
1 public class MergeTest {
2
3 public static void main(String args[]){
4 int[] array = new int[] {9,5,3,4,89,14,24,56,3,78,45};
5 Merge.sort(array);
6 for(int i : array){
7 System.out.print(i + " ");
8 }
9 }
10 }