归并排序的两种实现
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 }