private void mergeLow(int idxA, int lenA, int idxB, int lenB) {
        
        lengthA = lenA;
        lengthB = lenB;
        iterA = 0;       // Indexes into tmp array
        iterB = idxB;   // Indexes int a
        dest = idxA;      // Indexes int a
        Comparator<T> comp = this.comparator;

        
        T[] arr = this.array;
        T[] tempArray = tmpArray;
        System.arraycopy(arr, idxA, tempArray, 0, lengthA);

        arr[dest] = arr[iterB];
        dest++;
        iterB++;
        innerMergeLow(comp, arr, tempArray);

        //minGallop shouldn't be < 1
        minGallop = minGallop < 1 ? 1 : minGallop; 

        if (lengthA == 1) {//CopyB label
            System.arraycopy(arr, iterB, arr, dest, lengthB);
            // The last element of run A belongs at the end of the merge.
            arr[dest + lengthB] = tempArray[iterA];
        } else if(lengthA == 0){
            throw new UnsupportedOperationException("Compare function result changed! " +
                                                    "Make sure you do not modify the scene from"
                                                    + " another thread and that the comparisons are not based"
                                                    + " on NaN values.");
        } else {//Fail label
            System.arraycopy(tempArray, iterA, arr, dest, lengthA);
        }
    }
Merge the lenA elements starting at idxA with the lenB elements starting
at idxB in a stable way, in-place. lenA and lenB must be > 0, and idxA +
lenA = idxB Must also have that array[idxB] < array[idxA], that
array[idxA+lenA - 1] belongs at the end of the merge, and should have
lenA <= lenB. See listsort.txt for more info.

@param idxA index of first element in run A
@param lenA length of run A
@param idxB index of first element in run B
@param lenB length of run B
jme3-core/src/main/java/com/jme3/util/ListSort.java