Следующий алгоритм может сортировать три переменные x
, y
и z
типа K
, которые сопоставимы с помощью operator<
:
void sort2(K& x, K& y) {
if(y < x)
swap(x, y);
}
void sort3(K& x, K& y, K& z) {
sort2(x, y);
sort2(y, z);
sort2(x, y);
}
Это требует трех свопов в "худшем случае". Однако основная математика говорит нам, что упорядочение трех значений может быть выполнено с использованием только двух свопов.
Пример: значения (c, b, a) будут отсортированы с использованием трех свопов: (c, b, a) → (b, c, a) → (b, a, c) → (a,До нашей эры). Однако одного свопа было бы достаточно: (c, b, a) → (a, b, c).
Какими будут самые простые алгоритмы, которые сортируют три переменные с не более чем двумя свопами во всех случаях?