2.3.12

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

猜你喜欢

转载自www.cnblogs.com/w-j-c/p/9129714.html
今日推荐