2.2.3

question:

Answer EXERCISE 2.2.2 for bottom-up mergesort.

answer:

import edu.princeton.cs.algs4.*;

public class MergeBU
{
    private static Comparable[] aux;
    
    public static boolean less(Comparable v, Comparable w)
    {
        return v.compareTo(w) < 0;
    }
    
    public static void merge(Comparable[] a, int lo, int mid, int hi)
    {
        int i = lo;
        int j = mid + 1;
        for(int k = lo; k <= hi; k++)
            aux[k] = a[k];
        for(int k = lo; k <= hi; k++)
        {
            if(i > mid)
                a[k] = aux[j++];
            else if(j > hi)
                a[k] = aux[i++];
            else if(less(aux[j], aux[i]))
                a[k] = aux[j++];
            else
                a[k] = aux[i++];
        }
    }
    
    public static void sort(Comparable[] a)
    {
        aux = new Comparable[a.length];
        int N = a.length;
        for(int sz = 1; sz < N; sz+=sz)
        {
            for(int j = 0; j < N-sz; j+=2*sz)
            {
                merge(a,j,j+sz-1,Math.min(j+2*sz-1,N-1));
                show(a,j,Math.min(j+2*sz-1,N-1));
            }
        }
    }
    
    public static void show(Comparable[] a, int lo, int hi)
    {
        for(int i = 0; i < lo; i++)
        {
            StdOut.print("  ");
        }
        for(int i = lo; i <= hi; i++)
            StdOut.print(a[i] + " ");
        StdOut.println();
    }
    
    public static void main(String[] args)
    {
        //输入E A S Y Q U E S T I O N
        String[] a = In.readStrings();
        sort(a);
    }
}

猜你喜欢

转载自www.cnblogs.com/w-j-c/p/9117524.html