/**
* Copyright (C) 2011 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.financial.analytics;
import com.opengamma.util.ArgumentChecker;
/**
* Abstract form of a quick sort algorithm.
*/
/* package */abstract class QuickSorter<T> {
// TODO: This is most definately in the wrong place; there is at least one other QSort lying around
// (ParallelArrayBinarySort).
public abstract static class ArrayQuickSorter<T> extends QuickSorter<T> {
private final T[] _arr;
public ArrayQuickSorter(final T[] arr) {
ArgumentChecker.notNull(arr, "arr");
_arr = arr;
}
public void sort() {
sort(0, _arr.length - 1);
}
@Override
protected T getValue(final int index) {
return _arr[index];
}
@Override
protected void swap(final int first, final int second) {
swap(_arr, first, second);
}
}
protected final void sort(final int left, final int right) {
if (right > left) {
final int pivot = partition(left, right, (left + right) >> 1);
sort(left, pivot - 1);
sort(pivot + 1, right);
}
}
protected static <T> void swap(final T[] arr, final int first, final int second) {
final T tmp = arr[first];
arr[first] = arr[second];
arr[second] = tmp;
}
protected static void swap(final double[] arr, final int first, final int second) {
final double tmp = arr[first];
arr[first] = arr[second];
arr[second] = tmp;
}
protected abstract T getValue(final int index);
protected abstract void swap(final int first, final int second);
protected abstract int compare(final T first, final T second);
protected final int partition(final int left, final int right, final int pivot) {
final T pivotValue = getValue(pivot);
swap(pivot, right);
int storeIndex = left;
for (int i = left; i < right; i++) {
if (compare(getValue(i), pivotValue) < 0) {
swap(i, storeIndex);
storeIndex++;
}
}
swap(storeIndex, right);
return storeIndex;
}
}