Исправьте положительные целые числа n
и k
.
Пусть A
будет массивом длины n
с A[i]
массивом длины k
, где каждая запись n-i
,Например, для n=5
и k=1
это просто
[ [5] , [4] , [3] , [2] , [1] ]
, а для n=5
и k=2
это
[ [5,5] , [4,4] , [3,3] , [2,2] , [1,1] ]
Цель - всплытьсортируйте этот массив массивов, меняя числа в соседних массивах (например, меняйте местами A[i][j1]
с A[i+1][j2]
), пока каждая запись A[i]
не будет i+1
для каждого i
.
Вопрос в следующем: сколько нужно обменов и Какой оптимальный алгоритм ?
ПРИМЕЧАНИЕ: Есть много, много лучших алгоритмов сортировки для использования.Однако по этому вопросу меня интересует только использование пузырьковой сортировки, как описано выше.Я могу обмениваться записями только из соседних массивов, и меня интересует только минимальное количество таких необходимых обменов.Я ценю все предложения по другим алгоритмам сортировки, но я пытаюсь понять эту проблему.
ПРИМЕРЫ:
Для k=1
это хорошо известно.Число свопов - это число инверсии A
, рассматриваемое как перестановка, поэтому минимальное количество свопов - это биномиальный коэффициент (n choose 2) = n(n-1)/2
, и этого можно достичь, меняя любую пару из неупорядоченного порядка: A[i] > A[j]
.Для первого примера вот оптимальная сортировка пузырьков:
[ [5] , [4] , [3] , [2] , [1] ]
[ [4] , [5] , [3] , [2] , [1] ]
[ [4] , [5] , [2] , [3] , [1] ]
[ [4] , [2] , [5] , [3] , [1] ]
[ [4] , [2] , [5] , [1] , [3] ]
[ [4] , [2] , [1] , [5] , [3] ]
[ [4] , [1] , [2] , [5] , [3] ]
[ [1] , [4] , [2] , [5] , [3] ]
[ [1] , [4] , [2] , [3] , [5] ]
[ [1] , [2] , [4] , [3] , [5] ]
[ [1] , [2] , [3] , [4] , [5] ]
Для k=2
, использование той же стратегии даст ограничение на 2 (n choose 2)
необходимых свопов.Для приведенного выше примера это означает 20
свопы.Но есть решение, которое использует только 15
свопы:
[ [5,5] , [4,4] , [3,3] , [2,2] , [1,1] ]
[ [5,4] , [5,4] , [3,3] , [2,2] , [1,1] ]
[ [5,4] , [3,4] , [5,3] , [2,2] , [1,1] ]
[ [5,4] , [3,4] , [2,3] , [5,2] , [1,1] ]
[ [5,4] , [3,4] , [2,3] , [1,2] , [5,1] ]
[ [5,4] , [3,4] , [2,1] , [3,2] , [5,1] ]
[ [5,4] , [3,1] , [2,4] , [3,2] , [5,1] ]
[ [1,4] , [3,5] , [2,4] , [3,2] , [5,1] ]
[ [1,4] , [3,2] , [5,4] , [3,2] , [5,1] ]
[ [1,4] , [3,2] , [2,4] , [3,5] , [5,1] ]
[ [1,4] , [3,2] , [2,4] , [3,1] , [5,5] ]
[ [1,4] , [3,2] , [2,1] , [3,4] , [5,5] ]
[ [1,4] , [1,2] , [2,3] , [3,4] , [5,5] ]
[ [1,1] , [4,2] , [2,3] , [3,4] , [5,5] ]
[ [1,1] , [2,2] , [4,3] , [3,4] , [5,5] ]
[ [1,1] , [2,2] , [3,3] , [4,4] , [5,5] ]
Это решение является оптимальным для n=5
и k=2
(подтверждение методом грубой силы, чтобы найти все решения).Для n=6
лучшее решение требует 22
свопов, но решение выглядит не так хорошо, как для n=5
(следуйте 5 справа, затем 1 слева, затем 5 справа и т. Д.), ПоэтомуЯ до сих пор не знаю оптимальной стратегии, тем более формулы или лучшего определения количества свопов.
Я думал об этом уже пару дней и ничего не придумалпоучительно.Если у кого-то есть мысли по этой проблеме, то, пожалуйста, поделитесь ими.Я был бы рад узнать больше о деле k=2
.Еще лучше для любых мыслей по общему делу.
РЕДАКТИРОВАТЬ: Я прошу прощения, если я не могу мотивировать эту проблему по своему вкусу, но вот попытка: количество видов пузырьков, необходимых для сортировки перестановки, является очень важной статистикой в комбинаторике и теории чисел, называемой числом инверсииперестановки.Вы можете сортировать неупорядоченную перестановку, используя гораздо лучшие алгоритмы, но это тот, который дает вам алгебраическое значение.Если это не поможет, возможно, эта связанная статья SO может: Для чего нужна сортировка пузырьков?
ОБНОВЛЕНИЕ : самый старый ответ ниже дает нижнюю (и верхнюю) границу для числа обменов. второй самый старый ответ дает алгоритм, который действительно приближается к этой нижней границе (часто достигая ее).Было бы замечательно, если бы кто-то мог улучшить оценку или, что еще лучше, доказать, что приведенный ниже алгоритм является оптимальным.