zoukankan      html  css  js  c++  java
  • Algs4-2.2.22三向归并排序

    2.2.22三向归并排序。假设每次我们是把数组分成三个部分而不是两个部分并将它们分别排序,然后进行三向归并。这种算法的运行时间的增长数量级是多少?
    运算时间增长数量级是O(Nlg3N)。
    public class E2d2d22
    {
        public static void sort(Comparable[] a)
        {
            Comparable[] aux=new Comparable[a.length];
            sort(a,aux,0,a.length-1);
       }
       
        private static void sort(Comparable[] a,Comparable[] aux,int lo,int hi)
        {
             if (hi<=lo)    return ;
              int m1=lo+(hi-lo)/3;
              int m2=m1+1+(hi-m1-1)/2;
              sort(a,aux,lo,m1);
              sort(a,aux,m1+1,m2);
              sort(a,aux,m2+1,hi);
              merge(a,aux,lo,m1,m2,hi);
        }
       
        private static void merge(Comparable[] a,Comparable[] aux,int lo,int m1,int m2,int hi)
        {
          for(int k=lo;k<=hi;k++)
              aux[k]=a[k];
          //
          int aIndex=lo;
          int bIndex=m1+1;
          int cIndex=m2+1;
         
          Comparable A,B,C;
          Double maxValue=Double.MAX_VALUE;
          for(int k=lo;k<=hi;k++)
          {
               if (aIndex<=m1) A=aux[aIndex]; else A=maxValue;
               if (bIndex<=m2) B=aux[bIndex]; else B=maxValue;
               if (cIndex<=hi)   C=aux[cIndex]; else C=maxValue;
               //
               if(less(A,B) && less(A,C))
                 {a[k]=A;aIndex++;}
               else if(less(B,A) && less(B,C))
                 {a[k]=B;bIndex++;}
               else if(less(C,A) && less(C,B))
                 {a[k]=C;cIndex++;}
               else
                   {a[k]=A;aIndex++;}
          }
        }
     
        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 boolean isSorted(Comparable[] a)
        {
          for(int i=1;i<a.length;i++)
            if(less(a[i],a[i-1])) return false;
          return true;
        }
     
     public static void main(String[] args)
       {
         Integer N=Integer.parseInt(args[0]);
         Comparable[] a=new Comparable[N];
         for(int i=0;i<N;i++)
             a[i]=StdRandom.uniform();
        
         sort(a);
         StdOut.printf("%s",isSorted(a));
      }
    }

  • 相关阅读:
    Github精选——devops一体化监控平台工具WGCLOUD
    [搬运][中英双语]字体推荐 | 如果你每天都在代码面前,为何不让其变得有趣起来呢?
    【学习笔记】二分图最大匹配 -- 从网络流到匈牙利算法
    【详细揭秘】多重集の交错排列
    支配树口胡
    题解 洛谷 P2388 阶乘之乘
    [eJOI2019]异或橙子 题解
    VBA (Excel) 插入多行的方法 & 算法对比
    20000套免费ppt模板获取攻略
    包你扫到敬业福,集五福活动,福字大全
  • 原文地址:https://www.cnblogs.com/longjin2018/p/9860119.html
Copyright © 2011-2022 走看看