标签:print private answer ring The IV main less span
question:
Show, in the style of the trace given with the code, how the entropy-optimal sort first partitions the array B A B A B A B A C A D A B R A.
answer:
//就是三向切分快速排序
A A A A A A A B B B B B R D C
import edu.princeton.cs.algs4.*; public class Quick3way { public static void sort(Comparable[] a) { //去掉打乱 sort(a, 0, a.length-1); } private static void sort(Comparable[] a, int lo, int hi) { if(hi <= lo)//递归边界条件 return; int lt = lo, i = lo + 1, gt = hi;//lo到lt-1是小于v的,gt+1是大于v的,i到gt是是还未进行判断的元素,(都是闭区间) Comparable v = a[lo];//以数组第0个元素作为分割元素 while(i <= gt) { //我当时就一直在想为什么if里是i++,else if里却是i,然后我跟着书上的循环走了一遍就想通了,这里最根本的原因是v取了a[lo]而没取a[hi]! int cmp = a[i].compareTo(v); if(cmp < 0)//当前元素小分割元素,则与前半个区间交换元素,因为v是以数组第0个元素为分割元素的,所以可以保证与前半区间交换过来的一定是等于v的,所以i++就少了一次判断,当然你不相信的话也可以用i替换i++,不过多了几次循环而已 exch(a, lt++, i++); else if(cmp > 0)//这里就不能保证交换过来的元素一定等于v了,所以还要对交换过来的元素再进行一次判断,所以是i,而不是i++ exch(a, i, gt--); else i++;//当前元素等于分割元素 } show(a); sort(a, lo, lt - 1);//递归前半区间 sort(a, gt + 1, hi);//递归后半区间 } 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) { //B A B A B A B A C A D A B R A String[] a = In.readStrings(); sort(a); assert isSorted(a); show(a); } }
标签:print private answer ring The IV main less span
原文地址:https://www.cnblogs.com/w-j-c/p/9129714.html