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 }