private void initChildren( TreeFactory<T> treeFactory, SortableMemory<Column> cols, int childOffset, int start, int end, int[] selectiveBits, int prevSelBitIndex, int bitsToUse) throws IOException { if (end > start) { final int median = AbstractColumn.partition(cols, start, end, selectiveBits[++prevSelBitIndex]); if (bitsToUse > 1 && end > start + Leaf.MAX_LEAF_SIZE) { initChildren( treeFactory, cols, childOffset, start, median, selectiveBits, prevSelBitIndex, bitsToUse - 1); initChildren( treeFactory, cols, childOffset + (1 << (bitsToUse - 1)), median, end, selectiveBits, prevSelBitIndex, bitsToUse - 1); } else { children[childOffset] = treeFactory.createNode(cols, selectiveBits, prevSelBitIndex, start, median); children[childOffset + 1] = treeFactory.createNode(cols, selectiveBits, prevSelBitIndex, median, end); } } }