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