Expm 1_1 实现基于分治法的归并排序算法.

 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 }
View Code
原文地址:https://www.cnblogs.com/xiu68/p/7988697.html