2.2.9在库函数中使用aux[]这样的静态数组是不妥当的,因为可能会有多个程序同时使用这个类。实现一个不用静态数组的Merge类,但也不要将aux[]变为merge()的局部变量(请见本节的答疑部分)。提示:可以将辅助数组作为参数传递给递归的sort()方法。
import java.util.Arrays;
public class E2d2d9
{
public static int ArrayAccessTimes=0;
public static void sort(Comparable[] a)
{
Comparable[] aux=new Comparable[a.length];
sort(a,aux,0,a.length-1);
}
public static void sort(Comparable[] a,Comparable[] aux,int lo,int hi)
{
if (hi<=lo) return;
int mid=lo+(hi-lo)/2;
sort(a,aux,lo,mid);
sort(a,aux,mid+1,hi);
ArrayAccessTimes++;
merge(a,aux,lo,mid,hi);
}
public static void merge(Comparable[] a,Comparable[] aux,int lo,int mid,int hi)
{
int i=lo,j=mid+1;
for (int k=lo;k<=hi;k++)
{aux[k]=a[k];ArrayAccessTimes=ArrayAccessTimes+2;}
for(int k=lo;k<=hi;k++)
if (i>mid) {a[k]=aux[j++];ArrayAccessTimes=ArrayAccessTimes+2;}
else if (j>hi) {a[k]=aux[i++];ArrayAccessTimes=ArrayAccessTimes+2;}
else if (less(aux[j],aux[i])) {a[k]=aux[j++];ArrayAccessTimes=ArrayAccessTimes+2;}
else {a[k]=aux[i++];ArrayAccessTimes=ArrayAccessTimes+2;}
}
private static boolean less(Comparable v,Comparable w)
{ return v.compareTo(w)<0;}
public static boolean isSorted(Comparable[] a)
{
for(int i=1;i<a.length;i++)
if(less(i,i-1)) return false;
return true;
}
public static void main(String[] args)
{
int N=Integer.parseInt(args[0]);
Double[] a=new Double[N];
for(int i=0;i<N;i++)
a[i]=StdRandom.uniform();
sort(a);
StdOut.println("isSorted="+isSorted(a));
}
}
参考答疑:
![图片](http://a1.qpic.cn/psb?/f33bb27a-608a-4097-811a-86bbde18cf7a/ZHwhv*xnJjq.KwZAdFqZ*O3U35tQa4*DZO.N5EMLNbg!/b/dLAAAAAAAAAA&ek=1&kp=1&pt=0&bo=xAOnAMQDpwADEDU!&tl=1&su=0266507745&tm=1540602000&sce=0-12-12&rf=2-9)
import java.util.Arrays;
public class E2d2d9
{
public static int ArrayAccessTimes=0;
public static void sort(Comparable[] a)
{
Comparable[] aux=new Comparable[a.length];
sort(a,aux,0,a.length-1);
}
public static void sort(Comparable[] a,Comparable[] aux,int lo,int hi)
{
if (hi<=lo) return;
int mid=lo+(hi-lo)/2;
sort(a,aux,lo,mid);
sort(a,aux,mid+1,hi);
ArrayAccessTimes++;
merge(a,aux,lo,mid,hi);
}
public static void merge(Comparable[] a,Comparable[] aux,int lo,int mid,int hi)
{
int i=lo,j=mid+1;
for (int k=lo;k<=hi;k++)
{aux[k]=a[k];ArrayAccessTimes=ArrayAccessTimes+2;}
for(int k=lo;k<=hi;k++)
if (i>mid) {a[k]=aux[j++];ArrayAccessTimes=ArrayAccessTimes+2;}
else if (j>hi) {a[k]=aux[i++];ArrayAccessTimes=ArrayAccessTimes+2;}
else if (less(aux[j],aux[i])) {a[k]=aux[j++];ArrayAccessTimes=ArrayAccessTimes+2;}
else {a[k]=aux[i++];ArrayAccessTimes=ArrayAccessTimes+2;}
}
private static boolean less(Comparable v,Comparable w)
{ return v.compareTo(w)<0;}
public static boolean isSorted(Comparable[] a)
{
for(int i=1;i<a.length;i++)
if(less(i,i-1)) return false;
return true;
}
public static void main(String[] args)
{
int N=Integer.parseInt(args[0]);
Double[] a=new Double[N];
for(int i=0;i<N;i++)
a[i]=StdRandom.uniform();
sort(a);
StdOut.println("isSorted="+isSorted(a));
}
}
参考答疑: