static void quicksort(int A[], int low, int high) {
int pivot;
if (low < high) {
pivot = partition(A, low, high);
quicksort(A, low, pivot-1);
quicksort(A, pivot+1, high);
}
}
static int partition(Elem A[], int low, int high) {
Elem pivot;
Elem tmp;
int max = high;
int mid = (low + high) / 2;
tmp = A[mid];
A[mid] = A[high];
A[high] = tmp;
pivot = A[high];
low--;
do {
while(A[++low].key() < pivot.key());
while((low < high) && (A[--high].key() > pivot.key()));
tmp = A[low];
A[low] = A[high];
A[high] = tmp;
} while (low < high);
tmp = A[low];
A[low] = A[max];
A[max] = tmp;
return low;
}