1 package org.xiu68.exp.exp1;
2 public class Exp1_1 {
3
4 public static void main(String[] args) {
5 // TODO Auto-generated method stub
6 int[] arr=new int[]{100,9,8,7,6,5,4,3,2,1};
7 merge_sort(arr, 0, arr.length-1);
8
9 for(int i=0;i<arr.length;i++)
10 System.out.print(arr[i]+",");
11 }
12
13
14 public static void merge_sort(int[] arr,int first,int last){
15 if(first<last){
16 int m=(first+last)/2; //分割成两个子序列
17 merge_sort(arr, first, m); //归并排序前半部分
18 merge_sort(arr, m+1, last); //归并排序后半部分
19 merge(arr, first, m, last); //将两个已排序的子序列合并
20 }
21 }
22
23 //一次归并,二并一
24 public static void merge(int[] start,int s,int m,int t){
25 //s,m+1为两个有序序列的第一个记录,t为第二个序列的最后一个记录
26 int i=s;
27 int j=m+1;
28 int k=0;
29 int[] result=new int[t-s+1]; //result为辅助空间
30 while(i<=m && j<=t)
31 if(start[i]<=start[j]) //取start[i]和start[j]的最小者放入result[k]
32 result[k++]=start[i++];
33 else
34 result[k++]=start[j++];
35
36 if(i<=m) //第一个序列没有遍历完
37 while(i<=m)
38 result[k++]=start[i++];
39
40 else //第二个序列没有遍历完
41 while(j<=t)
42 result[k++]=start[j++];
43
44 for(int p=0;p<result.length;p++){
45 start[s++]=result[p];
46
47 }
48 }
49
50 }