归并排序(Java)

基本思想

归并排序的思路就是分而治之,将一个待排数组分成若干个小数组,再将这些小数组排序,再合并排好序的数组,如下图:  

               

 

 

(a) 把长度为4的数组分解成两个长度为2的子数组;
(b) 把长度为2的数组分解成两个成都为1的子数组;
(c) 把长度为1的子数组 合并、排序
(d) 把长度为2的子数组合并、排序;
接下来我们对长度为2的数组进行排序,首先使用两个指针指向两个数组的第一个数,并依次比较两个指针的数的大小,小的数字存储到已经准备好的辅助空间数组中,指向小的数字的指针右移,直到其中一个数组被遍历完,再将剩下的数组加到辅助空间末尾,更新原来的数组次序即可。
 

源代码如下

 1     public static void main(String[] args) {
 2         int []array= {7,5,6,4};
 3         margeDown(array, 0, array.length-1);
 4         for(int i=0;i<array.length;i++)
 5             System.out.println(array[i]);
 6     }
 7     
 8     public static void margeDown(int []array,int start,int end) {
 9         if(array==null||start>=end)
10             return;
11         
12         int mid=(start+end)/2;
13         margeDown(array, start, mid);
14         margeDown(array, mid+1, end);
15         
16         margeSort(array, start, mid, end);
17     }
18     
19     public static void margeSort(int []array,int start,int mid,int end) {
20         
21         int []newArray=new int[end-start+1];
22         int i=start;
23         int j=mid+1;
24         int k=0;
25         
26         while(i<=mid&&j<=end) {
27             if(array[i]<=array[j]) 
28                 newArray[k++]=array[i++];
29             else
30                 newArray[k++]=array[j++];
31         }
32         
33         while(i<=mid)
34             newArray[k++]=array[i++];
35         while(j<=end)
36             newArray[k++]=array[j++];
37         
38         for(i=0;i<k;i++)
39             array[start+i]=newArray[i];
40         newArray=null;
41         
42     }

 

posted @ 2018-12-03 13:40  轻抚丶两袖风尘  阅读(145)  评论(0编辑  收藏  举报