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