Самый быстрый способ - сортировка по квадратным отверстиям на месте O (N).
Начать с первого расположения массива, a[0]
. Скажем, оно имеет значение 5
. Вы знаете, что 5
принадлежит a[4]
, поэтому поменяйте местами 0
и 4
. Теперь новое значение в a[0]
. Поменяйте его туда, куда нужно.
Повторяйте до a[0] == 1
, затем переходите к a[1]
и меняйте местами до a[1] == 2
и т. Д.
Если в какой-то момент вы попытаетесь поменять местами два одинаковых значения, значит, вы нашли дубликат!
Время выполнения: O (N) с очень низким коэффициентом и ранним выходом. Требуется хранилище: ноль.
Бонусная оптимизация: подсчитайте, сколько свопов произошло, и выйдите досрочно, если n_swaps == array_size
. Это привело к улучшению на 15%, когда я реализовал аналогичный алгоритм для перестановки последовательности.