排序-归并排序-Java

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

将一个数组分成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中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值