自底向下的原地归并排序

自底向下的原地归并排序

归并排序详情请查看:自顶向下的原地归并排序
这是归并排序的另外一种实现方法。
思路:先归并那些微型数组,然后再成对的归并得到的子数组。
实例:

import java.util.Random;

public class MergeBU {

    private static Comparable[] aux;//辅助数组

    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));
            }
        }
    }

    private static  void merge(Comparable[] a,int start,int mid,int end){
        //将a[start-mid]和a[(mid+1)-end]归并
        int i =start;
        int j = mid+1;
        for(int k = start;k<=end;k++){
            aux[k]=a[k];  //先复制数组
        }

        for(int k =start;k<=end;k++){   //进行归并操作,将左右归并
            if(i>mid)
                a[k]=aux[j++];
            else if(j>end)
                a[k]=aux[i++];
            else if(less(aux[i],aux[j]))
                a[k]=aux[i++];
            else
                a[k]=aux[j++];
        }
    }
//less(),each(),show()以及测试代码见博主其他排序文章,篇幅有限,这里不给出
    //https://blog.csdn.net/qq_41906510/article/details/105590998
}
跟踪归并过程:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200418191809110.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxOTA2NTEw,size_16,color_FFFFFF,t_70)
发布了26 篇原创文章 · 获赞 1 · 访问量 2539

猜你喜欢

转载自blog.csdn.net/qq_41906510/article/details/105603515
今日推荐