蛇足風味

再帰しないクイックソートはこんな感じです。不安定です。(正しさは証明してないので要注意。)

static <T extends Comparable<? super T>> void qsort(T[] array, int begin, int end)
{
    int[] stack = new int[64];
    int sp = 0;
    for (;;) {
        if (end <= begin + 10) {
            for (int i = begin + 1; i < end; i++) {
                T x = array[i];
                int j = i;
                while (--j >= begin && x.compareTo(array[j]) < 0)
                    array[j + 1] = array[j];
                array[j + 1] = x;
            }
            if (sp == 0) return;
            end = stack[--sp]; begin = stack[--sp];
        } else {
            T a = array[begin], b = array[(begin + end) / 2], c = array[end - 1];
            T pivot = (a.compareTo(b) < 0 ? 
                       (b.compareTo(c) < 0 ? b : a.compareTo(c) < 0 ? c : a) : 
                       (c.compareTo(b) < 0 ? b : c.compareTo(a) < 0 ? c : a));
            int l = begin - 1, r = end;
            for (;;) {
                while (pivot.compareTo(array[++l]) > 0) ;
                while (pivot.compareTo(array[--r]) < 0) ;
                if (l >= r) break;
                T t = array[l]; array[l] = array[r]; array[r] = t;
            }
            if (l - begin >= end - l) {
                stack[sp++] = begin; stack[sp++] = l; begin = l;
            } else {
                stack[sp++] = l; stack[sp++] = end; end = l;
            }
        }
    }
}