归并排序(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 }