1. 程式人生 > >2.3.12

2.3.12

col reads ray 走了 ring boolean 去掉 class bool

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); } }

2.3.12