Вы можете попробовать быструю сортировку, но не делать это полностью.Я слышал, что Haskell делает это аналогичным образом.
Это почти обычная быстрая сортировка, но вы откладываете работу, которую можно отложить.
Для первого элемента это будет просто быстрый выбор, где вы пропуститедиапазоны не имеют значения для первого элемента.Но для каждого следующего элемента вы должны искать диапазоны, которые еще не были разделены, но необходимы для этого, и разбивать их.
Время для первого элемента будет O(n)
(и вряд ли вы получите что-то лучше), все время будет O(n * log n)
.
Кажется, что дополнительная память для хранения позиций диапазона O(log n)
, но я не думал об этом достаточно, чтобы быть уверенным.
Исправление:если вам нужно каждый раз выводить весь подмассив, это будет O(n^2)
, только если вы выводите по номеру за раз - это будет O(n * log n)
.