|
The Pizza Compiler
The Pizza language is an extension to Java with three new features: |
Pizza Example: Quicksort
|
|
/*
* File qsort.pizza
*/
package net.sf.pizzacompiler.examples;
/**
* The main class for quicksorting arrays.
*
* The class is parameterized with the element type of the arrays to
* be sorted.
*
* @author Martin Odersky 96/10/07
* @author John Maraist 96/11/07
*/
public class QuickSorter<A> {
/**
* The comparison function
*/
private (A,A)->boolean less;
/**
* Creates a new sorter
* @param less the comparison function
*/
public QuickSorter((A,A)->boolean less) {
this.less = less;
}
/**
* Sorts all elements in array between bounds
* @param xs the array to be sorted
* @param lo the lower bound
* @param hi the upper bound
*/
private void sort(A[] xs, int lo, int hi) {
int i = lo;
int j = hi;
A pivot = xs[(i+j)/2];
do {
while (less(xs[i], pivot)) i++;
while (less(pivot, xs[j])) j--;
if (i <= j) {
A temp = xs[i];
xs[i] = xs[j];
xs[j] = temp;
i++;
j--;
}
} while (i <= j);
if (lo < j) sort(xs, lo, j);
if (i < hi) sort(xs, i, hi);
}
/** sorts array
* @param xs the array to be sorted
*/
public void sort(A[] xs) {
if (xs.length > 1) sort(xs, 0, xs.length-1);
}
/** static method to sort an array with a given comparison functon
* @param xs the array to be sorted
* @param less the comparison function
*
* This method is executed in two steps. We first create an object
* of the class for the particular sorting function, and then call
* the sort method for a particular array.
*
*/
public static <B> void sort(B[] xs, (B,B)->boolean less) {
new QuickSorter(less).sort(xs);
}
}
class QuickSortTest {
static boolean less(String x, String y) {
return x.compareTo(y) < 0;
}
static boolean greater(String x, String y) {
return x.compareTo(y) > 0;
}
static void showArray(String[] a) {
for (int i=0; i < a.length; i++)
System.out.print(a[i] + " ");
System.out.println();
}
public static void main(String[] argv) {
System.out.print("The original array: ");
showArray(argv);
QuickSorter<String> q = new QuickSorter(less);
q.sort(argv);
System.out.print("Sorted small first: ");
showArray(argv);
QuickSorter.sort(argv, greater);
System.out.print("Sorted big first: ");
showArray(argv);
q.sort(argv);
System.out.print("Resorted small first: ");
showArray(argv);
}
}