大概是1.2*N*lnN
package Cap2_3;
import Cap2_1.SortTemplate;
import edu.princeton.cs.introcs.StdOut;
import edu.princeton.cs.introcs.StdRandom;
public class Quick extends SortTemplate{
private static int cnt = 0;
public static void sort(Comparable[] a){
StdRandom.shuffle(a);
sort(a, 0, a.length-1);
}
private static void sort(Comparable[] a, int lo, int hi){
if(hi <= lo) return;
int j=partition(a, lo, hi);
sort(a, lo, j-1);
sort(a, j+1, hi);
}
private static int partition(Comparable[] a, int lo, int hi){
int i=lo, j=hi+1;
Comparable v = a[lo];
while(true){
while(++cnt!=0&&less(a[++i], v)) if(i == hi) break;
while(++cnt!=0&&less(v, a[--j])) if(j == lo) break;
if(j>i) exch(a, i, j);
else break;
}
exch(a, lo, j);
return j;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
for(int N=10;N<=100000;N*=10){
Quick.cnt=0;
Integer[] a = new Integer[N];
for(int i=0;i<N;i++)
a[i]=1;
// StdRandom.shuffle(a);
sort(a);
assert isSorted(a);
StdOut.println("N="+N+" \tcnt="+Quick.cnt+" \t"+(1.20*N*Math.log(N)));
}
}
}
N=10 cnt=26 27.63102111592855
N=100 cnt=564 552.6204223185711
N=1000 cnt=8898 8289.306334778565
N=10000 cnt=121034 110524.0844637142
N=100000 cnt=1561130 1381551.0557964274