排序-归并排序-Java

来源:互联网 发布:马来西亚华人知乎 编辑:程序博客网 时间:2024/04/29 18:32

归并是利用二叉树的思想来实现

将一个数组分成2个,再次分,再次分。一直分,然后再利用递归来实现。1个和另一个组成一个,两个再与另外两个有序的组成一个大的。一直进行下去。

这里写图片描述

分为自顶向下和自底向上

向下:

package sorts;import object.Example;import object.Merge;public class Merge_toptobottom extends Example{     private static Comparable[] aux;     public static void merge(Comparable[] a,int lo, int mid, int hi){          int i=lo,j=mid+1;          for(int k=lo;k<=hi;k++){aux[k] = a[k];}//将a赋到aux中,再通过aux将数组赋值给a          for(int k=lo;k<=hi;k++){              if      (i>mid){a[k]=aux[j++];}//如果左边没了,那么右边直接放入              else if (j>hi) {a[k]=aux[i++];}//如果右边没了,那么左边直接放入。//因为本来就是将有序的数组合并~一边没了当然就可以放入另一边的了              else if (less(aux[j], aux[i])) {a[k]=aux[j++];}//i是lo向右,j是mid+向右也就是分别是两个数组的头。进行比较这个的是说如果aux[j]小于aux[i],那么就把数组aux[j]他小啊,将其放入a[k]中              else {a[k]=aux[i++];}               //这个就是左边的数组的那个值小,将其放入          }     }     public static void sort(Comparable[] a,int lo,int hi){          if(hi<=lo) return;          int mid = lo+(hi-lo)/2;          sort(a, lo, mid);//左边的,然后递归          sort(a,mid+1,hi);          merge(a, lo, mid, hi);//最后合并数组     }     public static void main(String[] a){          Comparable[] ac = new Comparable[]{7,6,5,8,9,4,9,3,1,5,2,1,5,4};          aux = new Comparable[ac.length];          sort(ac, 0, ac.length-1);          show(ac);     }}

自底向上:

package sorts;import object.Example;public class Merge_bottomtotop extends Example{private static Comparable[] aux;     public static void merge(Comparable[] a,int lo, int mid, int hi){          int i=lo,j=mid+1;          for(int k=lo;k<=hi;k++){aux[k] = a[k];}          for(int k=lo;k<=hi;k++){              if      (i>mid){a[k]=aux[j++];}              else if (j>hi) {a[k]=aux[i++];}              else if (less(aux[j], aux[i])) {a[k]=aux[j++];}              else {a[k]=aux[i++];}          }     }     public static void sort(Comparable[] a){          int N = a.length;          aux = new Comparable[N];          for(int sz =1;sz<N;sz=sz+sz){              for(int lo=0;lo<N-sz;lo+=sz+sz){                   merge(a, lo, lo+sz-1, Math.min(lo+sz+sz-1, N-1));              }          }     }     public static void main(String[] a){          Comparable[] ac= new Comparable[]{6,5,7,4,8,3,9,2,0,1,5};          sort(ac);          show(ac);     }}

参考:

http://blog.csdn.net/kwang0131/article/details/51074899
http://blog.csdn.net/jianyuerensheng/article/details/51262984
http://blog.csdn.net/linsheng9731/article/details/22928671

主要对merge的代码的解释,后面的主要是使用merge然后递归
merge是合并数组

比如上面的利用递归的,然后分成两个,最后merge合并
将合并的数组添加到aux中

原创粉丝点击