1. 程式人生 > >Algs4-2.3.27忽略小數組

Algs4-2.3.27忽略小數組

iss print public rand 通過 urn str bsp rgs

2.3.27忽略小數組。用實驗對比以下處理小數組的方法和練習2.3.25的處理方法的效果:在快速排序中直接忽略小數組,僅在快速排序結束後運行一次插入排序。註意:可以通過這些實驗估計出電腦的緩存大小,因為當數組大小超出緩存時這種方法的性能可能會下降。
public class E2d3d27
{
public static void sort1(Comparable[] a,int M)
{
//StdRandom.shuffle(a);
sort1(a,0,a.length-1,M);
}

private static void sort1(Comparable[] a,int lo,int hi,int M)
{
//數組少於等於M個元素時使用插入排序
if (hi-lo+1<M)
{
InsertSort(a,lo,hi);
return;
}
int j=partition(a,lo,hi);
sort1(a,lo,j-1,M);
sort1(a,j+1,hi,M);
}

public static void sort2(Comparable[] a,int M)
{
//StdRandom.shuffle(a);
sort2(a,0,a.length-1,M);
}

private static void sort2(Comparable[] a,int lo,int hi,int M)
{
//數組少於等於M個元素時使用插入排序
if (hi-lo+1<M) return;
int j=partition(a,lo,hi);
sort2(a,lo,j-1,M);
sort2(a,j+1,hi,M);
}

private static int partition(Comparable[] a,int lo,int hi)
{
int i=lo,j=hi+1;
Comparable v=a[lo];
while(true)
{
while(less(a[++i],v)) if(i==hi) break;
while(less(v,a[--j])) if(j==lo) break;

if(i>=j) break;
exch(a,i,j);
}
exch(a,lo,j);
return j;
}


private static void InsertSort(Comparable[] a,int lo,int hi)
{
for (int i=lo+1;i<hi+1;i++)
{
for (int j=i;j>0 && less(a[j],a[j-1]);j--)
exch(a,j,j-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;
}

private static void show(Comparable[] a)
{
for (int i=0;i<a.length;i++)
StdOut.print(a[i]+" ");
StdOut.println();
}

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)
{
int Nlen[]={100000,500000,1000000,5000000};
for(int Ni=0;Ni<Nlen.length;Ni++)
{
int N=Nlen[Ni];
//生成一個長度為N的數組a
Double[] a=new Double[N];
for(int i=0;i<N;i++)
a[i]=StdRandom.random();
//
int M=11;
//生成數組a的兩個副本aClone1、aClone1
Double[] aClone1=new Double[N];
for (int i=0;i<a.length;i++)
aClone1[i]=a[i];

Double[] aClone2=new Double[N];
for (int i=0;i<a.length;i++)
aClone2[i]=a[i];
//數組長度為N,小於等於M時切換到插入排序的快速排序
Stopwatch timer1=new Stopwatch();
sort1(aClone1,M);
double t1=timer1.elapsedTime();
//數組長度為N,小於等於M忽略小數組的快速排序
Stopwatch timer2=new Stopwatch();
sort2(aClone2,M);
InsertSort(aClone2,0,aClone2.length-1);
double t2=timer2.elapsedTime();

StdOut.printf("N=%d,T1=%f,T2=%f,t1-t2=%f\n",N,t1,t2,t1-t2);
}//end for Ni

}//end main
}//end class

Algs4-2.3.27忽略小數組