Этот код по большей части там. Я просто не сделал ту часть, где он меняет местами поменяемые значения между x, j и между j, y. (можно поменять местами .. я еще этого не сделал).
Во всяком случае .. У меня нет времени, чтобы завершить это, я боюсь, но, надеюсь, вы можете:
def brute_force(nums):
neg = [i for i in nums if i<0]
pos = [i for i in nums if i>=0]
return neg+pos
def in_place(nums,i,j,depth):
x,y = i,j
print 'running on ',nums[i:j+1]
if j-i==1:
a,b = nums[i],nums[j]
if a>=0 and b<0:
nums[i],nums[j] = b,a
return None
#print i,j
while i<j:
a,b = nums[i],nums[j]
if (a<0 and b>=0):
i+=1
j-=1
elif (a>=0 and b<0):
nums[i],nums[j]=-b,-a
i+=1
j-=1
elif a<0:
i+=1
else:
j-=1
print "changed1 to ", nums
print nums[x:j+1],nums[j+1:y+1]
start = (i for i in reversed(nums[x:j+1]) if i>=0)
for i in range(x,j):
if nums[i]>=0:
nums[i]=next(start)
print "changed2 to ", nums
end = (i for i in reversed(nums[j+1:y+1]) if i<0)
for i in range(j+1,y+1):
if nums[i]<0:
nums[i]=next(end)
print "changed3 to ", nums
if depth == 0:
in_place(nums,0,j,depth+1)
in_place(nums,j+1,len(nums)-1,depth+1)
nums = [1,2,-4,-5,3,-6]
print brute_force(nums)
in_place(nums,0,len(nums)-1,0)
print nums
print "going z"
#z = [-2,3,-1]
#in_place(z,0,2,0)
#print z
Дальнейший пример:
_list = [1,-4,2,-5,3,-6]
def in_place(nums,i,j,depth):
x,y = i,j
print 'running on ',nums[i:j+1]
if j-i==1:
a,b = nums[i],nums[j]
if a>=0 and b<0:
nums[i],nums[j] = b,a
return None
#print i,j
while i<j:
a,b = nums[i],nums[j]
if (a<0 and b>=0):
i+=1
j-=1
elif (a>=0 and b<0):
nums[i],nums[j]=-b,-a
i+=1
j-=1
elif a<0:
i+=1
else:
j-=1
print "changed1 to ", nums
in_place(_list,0,len(_list)-1,0)
>>>
running on [1, -4, 2, -5, 3, -6]
changed1 to [6, -4, 5, -2, 3, -1]