Глядя на формулировку проблемы, похоже, что вы хотите отсортировать список, в котором номера начинаются с 1 по n.
Если вы пытаетесь отсортировать список, и ожидается, что окончательный список будет [1, 2, 3, 4, 5, 6, 7 , 8, .....]
, тогда все, что вам нужно сделать, это вставить i+1
в текущую позицию и извлечь значение i+1
из его текущей позиции. Это уменьшит количество итераций, которые вам нужно сортировать или поменять местами.
Вот код, который делает это с наименьшим количеством ходов. По крайней мере, это то, что я обнаружил на основе своих тестов.
def minSwap(ar):
c=0
for i in range(0, len(ar)):
if ar[i] != i+1:
#find the value of i+1 from i+1th position
temp = ar.index(i+1,i+1)
ar.insert(i,i+1) #insert i+1 in the ith position
ar.pop(temp+1) #remove the value of i+1 from the right
c+=1 #every time you do a swap, increment the counter
print (ar) #if you want to check if ar is correct, use this print stmt
return c
a = [1,3,4,5,6,7,2,8]
print (minSwap(a))
Общее количество свопов для приведенного выше примера составляет 1
. Он просто вставляет 2
на втором месте и выскакивает 2
из позиции 6
.
Я запустил код для a = [1,6,5,4,3,8,2,7]
, и он заменил 5
перемещений.
Я запустил код для a = [1,3,5,4,6,8,2,7]
, и он поменял местами за 3 хода.
Если вы пытаетесь понять, как это работает, используйте оператор печати сразу после оператора if. Он сообщит вам об заменяемом элементе.