Pull to refresh

Сортировка данных и возвращение им прежнего порядка

Reading time2 min
Views5K
Довольно часто в спортивном программировании или же просто реализации алгоритмов необходимо отсортировать массив входных данных по определённому критерию. В то время как в ответе требуется исходный порядок. В статье я рассмотрю несколько способов сделать это минимальной кровью на C++. Если интересна эта тематика или имеются интересные предложения, прошу под кат…


Автор изображения: Tobias Rad, лицензия Creative Commons Attribution-Share Alike 3.0 Unported

Первая идея была отсортировать массив своим алгоритмом, запомнить все пары обменов значений в массиве, кого с кем меняли местами. И когда потребуется вернуть исходный порядок, повторить эти же обмены в обратном порядке. Конечно же свой алгоритм сортировки, написанный за пару минут, даже отдалённо не догоняет std::sort(). Потому появилась вторая идея, запоминать начальные индексы записей и сортировать по ним при помощи std::sort().

В приведенных способах при заполнении массива данными необходимо поле Domino::index заполнять порядковым номером записи.

Первый способ, с использованием статического члена и функтора:


Исходник можно взять здесь: http://codepad.org/0PWSzTBc

Второй способ, с использованием статического члена и оператора<:


Исходник можно взять здесь: http://codepad.org/1zsTnk4s

Третий способ, с использованием лямбд (C++0x):


Исходник можно взять здесь: http://codepad.org/5WRgCxLw

Первые два способа очень похожи, за исключением оператора, который передаётся явным образом или используется по-умолчанию функцией сортировки. Третий способ просто показывает насколько проще можно получить тот же результат, описывая оператор прямо в месте его использования. К сожалению, далеко не все платформы для проведения соревнований по спортивному программированию поддерживают C++0x.
Tags:
Hubs:
Total votes 38: ↑30 and ↓8+22
Comments42

Articles