private void mergeCollapse() {
        while (nbRuns > 1) {
            int n = nbRuns - 2;
            //searching for runs to merge from the end of the stack
            if (n > 0 && runsLength[n - 1] <= runsLength[n] + runsLength[n + 1]) {
                if (runsLength[n - 1] < runsLength[n + 1]) {
                    n--;
                }
                mergeRuns(n);
            } else if (runsLength[n] <= runsLength[n + 1]) {
                mergeRuns(n);
            } else {
                break;
            }
        }
    }
Examine the stack of runs waiting to be merged, merging adjacent runs
until the stack invariants are re-established:

1. len[-3] > len[-2] + len[-1] 2. len[-2] > len[-1]

See http://svn.python.org/projects/python/trunk/Objects/listobject.c very
similar to merge_collapse

see http://svn.python.org/projects/python/trunk/Objects/listsort.txt
search for The Merge Pattern
jme3-core/src/main/java/com/jme3/util/ListSort.java