Один из вариантов - хранить вспомогательный BST, содержащий информацию о том, какие контейнеры фактически используются.Всякий раз, когда вы добавляете что-то в корзину, если это первая запись, которая будет помещена туда, вы также добавляете значение этого сегмента в BST.BST в отсортированном порядке, объединяя только те сегменты, которые вы нашли.
Если есть z блоков, которые фактически используются, это занимает O (n + z log z).Если количество сегментов велико по сравнению с фактически используемым количеством, это может быть намного быстрее.
В более общем случае - если у вас есть способ сортировки z различных сегментов, используемых в O (f (z))время, вы можете выполнить сортировку сегмента за O (n + f (z)).Поддерживайте второй массив блоков, которые вы фактически используете, добавляя сегмент в массив, когда он используется в первый раз.Прежде чем выполнять итерации по сегментам, отсортируйте по времени O (f (z)) индексы используемых блоков, а затем выполните итерацию по всему массиву, чтобы определить, какие сегменты следует посетить.Например, если вы использовали y-быстрые деревья, вы можете отсортировать по O (n + z log log z).
Надеюсь, это поможет!