当前位置: 代码迷 >> 综合 >> 算法 第四版 2.3.8
  详细解决方案

算法 第四版 2.3.8

热度:19   发布时间:2023-09-23 03:25:32.0

大概是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 stubfor(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





  相关解决方案