归并排序:自顶向下(分治法),自底向上

本文深入解析了归并排序算法的实现细节,包括不借助辅助数组和借助辅助数组的两种版本,以及自底向上的归并排序方法。文章还提供了完整的Java代码实现,涵盖了排序、合并操作、插入排序优化及数组比较等关键部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class MergeSort {
    public  static  Comparable[] aux;
    /*50长度以下的数组 */
    public  static  int carry=50;
  //不借助辅存版本
    public static  void merge(Comparable[] a,Comparable[] dst,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)
                dst[k]=a[j++];
            else if(j<hi)
                dst[k]=a[i++];
            else if(less(a[j],a[i]))
                dst[k]=a[j++];
            else
                dst[k]=a[i++];
        }
    }
   //借助辅存版本
    public static  void mergebu(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){
           aux=new Comparable[a.length];

    }

    /*
    *
    *
    * */
    public static void sort(Comparable[] a,Comparable[] dst,int lo,int hi){
        if(lo<=hi) return;
        int mid=(lo+hi)/2;
        if((hi-lo)<carry){
            /*
            *如果子数组较小插入排序 减少递归函数调用
            *
            */
            insertsort(a,lo,hi);


        }else{
            sort(a,dst,lo,mid);
            sort(a,dst,mid+1,hi);
            /*
            * a[mid]小于a[mid+1] 因为 lo...mid mid+1....hi是有序的 数组是有序的
            *
            * */
            if(!less(a[mid],a[mid+1])){
                merge(a,dst,lo,mid,hi);
            }else{
                System.arraycopy(a,lo,dst,lo,hi-lo+1);
            }

        }


    }
    /*
    * 自底向上版本
    *
    * */
    public static  void sortbu(Comparable[] a){
        int N=a.length;
        aux=new Comparable[N];
        for (int i = 1; i <N ; i=i+i) {
            /*i 为 1 2 4 8正是象征着子数组主键变化的长度*/
            for(int lo=0;lo<N-i;lo+=i+i){
                mergebu(a,lo,lo+i-1,Math.min(lo+i+i,N-1));
            }
        }
    }

    private  static  boolean less(Comparable v,Comparable w){
        return v.compareTo(w)<0;
    }

    private  static  void exch(Comparable[] a,int i,int j){
        Comparable t=a[i];a[i]=a[j];a[j]=t;
    }


    public  static  void insertsort(Comparable[] a,int lo,int hi){
        for (int i = lo; i <=hi; i++) {
            for (int j = i; j >lo&&less(a[j],a[j-1]) ; j--)
            exch(a,j,j-1);
        }
    }

    public  static boolean isSorted(Comparable[] a){
        for (int i = 0; i <a.length ; i++) {
            if(less(a[i],a[i])) return false;
         }
         return  true;
    }

    public  static  void main(String[] args){
        //String[] a=In.readStrings();
        String a[]={"123","23","123"};
        sort(a);
        
        System.out.println();
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值