Жалуется на дополнительное место, потому что вы создаете второй список для хранения результата. С небольшим количеством данных это вполне разумный способ go об этом. Но если в вашем списке тысячи записей вместо нескольких, создание копии может оказаться невозможным. В этом случае вам может понадобиться переместить элементы списка на место .
Мы начнем с наблюдения, что список отсортирован и элементы в последней половине списка перемещены в ранее в списке, в четных позициях (0, 2, 4). Итак, сначала посчитайте, сколько элементов должно быть смещено на ранее в списке. Затем для каждого из элементов, подлежащих смещению, вычислите его новую позицию (0, 2, 4) и переместите его туда.
Первый смещаемый элемент находится в конце списка. После того, как он был перемещен в более раннюю точку, следующий элемент, который должен быть перемещен, теперь находится в конце списка. Таким образом, перемещаемый элемент всегда является последним в списке, и его можно извлечь с помощью pop()
.
Примерно так:
a = [1,2,3,4,5,6,7]
shifts = len(a)//2
for i in range(shifts):
print(f"shifting {a[-1]} to position {i*2}")
a.insert(i*2,a.pop())
print (a)
Вывод из последнего вызова print()
это [7, 1, 6, 2, 5, 3, 4]
. print()
вызов внутри l oop просто для того, чтобы показать вам, что происходит.
Этот альтернативный способ это меняет время выполнения на пространство. Каждый раз, когда вы вставляете элемент в список, кроме конца, все последующие элементы должны перемещаться вправо, чтобы освободить место. Это делает большую обработку за вашей спиной, даже если это одна строка кода.