代码改变世界

归并排序的两种实现

2013-02-04 16:22  Polarisary  阅读(234)  评论(0编辑  收藏  举报

sort是正常的递归实现归并排序,sortWithFor是从单个元素到整个集合实现归并排序,两种思想殊途同归。

 1 public static Comparable[] aux;
 2     /**
 3      * 自顶向下递归的归并排序
 4      * @param a 集合
 5      */
 6     public static void sort(Comparable[] a){
 7         aux = new Comparable[a.length];
 8         sort(a,0,a.length-1);
 9     }
10     public static void sort(Comparable[] a,int low,int high){
11         if(low>=high) return;
12         int mid = low + (low+high)/2;
13         //递归调用 排序前半段
14         sort(a,low ,mid );
15         //递归排序后半段
16         sort(a,mid+1,high);
17         //将两有序段合并
18         merge(a,low,mid,high);
19     }
20 
21     /**
22      * 合并
23      * @param a 待排集合
24      * @param low 合并起始索引
25      * @param mid 合并中间索引
26      * @param higt 合并结束索引
27      */
28     public static void merge(Comparable[] a,int low,int mid,int higt){
29 
30         for(int i=low;i<higt;i++)
31             aux[i] = a[i];
32         int i = low;
33         int j = mid;
34         for(int t=low;t<=higt;t++){
35             if(i>=mid) a[t] = aux[j++];
36             else if(j>=higt) a[t] = aux[i++];
37             else if(aux[i].compareTo(aux[j])<0) a[t] = aux[i++];
38             else a[t] = aux[j++];
39         }
40     }
41     //把集合a看成是单个元素组成的有序序列,两两合并成有序的由两个元素有序组成的序列,再四四合并,直到整个集合有序
42     public static void sortWithFor(Comparable[] a){
43         int n = a.length;
44         for(int curser = 1;curser<n;curser+=curser){
45             for(int low=0;low<n-curser;low=low+2*curser){
46                 merge(a,low,low+curser-1,Math.min(low+2*curser,n-1));
47             }
48         }
49     }