Ради простоты предположим, что вы сортируете контейнер целых чисел по расстоянию до заданного целого числа, а затем рассмотрите этот пример (уже отсортированный в порядке возрастания):
1 2 5 12 20 100
Допустим, вы хотитечтобы отсортировать это по расстоянию до 10, то результат будет
12 5 2 1 20 100
Теперь отсортировано по расстоянию до 15
12 20 5 2 1 100
Элементы выглядят полностью переупорядоченными, однако если вы думаете,из сортировки в два этапа довольно очевидно, как связаны разные сортировки.
Давайте начнем снова с оригинала
1 2 5 12 20 100
^------------ 10
^--------- 15
Теперь, если вы сортируете по расстоянию до 10, у вас уже естьполовина работы выполнена, потому что две части
5 2 1 // first part reversed
12 20 100 // second part
уже отсортированы, вам просто нужно объединить их (просто O (N)).То же самое для сортировки по расстоянию до 15:
12 5 2 1 // already sorted
20 100 // already sorted
объедините их в O (N), и все готово.
Это просто для того, чтобы очертить идею.Возможно, я бы использовал std::vector
, который просто сортируется в порядке возрастания, а затем создание желаемой сортировки довольно дешево.Можно даже подумать, что саму vector
всегда нужно сортировать в порядке возрастания и предоставлять итераторы только для разных видов.