排序算法之------归并排序

归并算法: 要将一个数组排序,可以先(递归地)将它分成两半分别排序,然后将结果归并起来。

时间复杂度为 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 }

 

 

 

 

 

posted @ 2016-11-21 20:40  huangyichun  阅读(221)  评论(0编辑  收藏  举报