知乎上有相关讨论:https://www.zhihu.com/question/50512830
def minmax_sort(A):
n = len(A)
def index(i):
'''
根据观察得到原数组和变换后的数组下标关系,
这里考虑下标从1开始
'''
if i<=n/2:
return 2*i
return (2*n-2*i+1)%(n+1)
A = A
for ii in xrange(1,n+1):
prev = A[ii-1]
if prev<0:#判断是否已经循环过了
continue
save,i = ii,ii
while True:
'''
关键部分,下标index(index(i))
嵌套会成为一个环,环之间不交叉,
对每个环将数放到它应该在的位置
'''
i = index(i)
cur = A[i-1]
A[i-1] = -prev #标记该位置已经被置换过了
prev = cur
if save==i: #回到循环起点
break
for i in xrange(n): #回正
A[i] *=-1
print(A)
return A
a = range(8,0,-1)
minmax_sort(a)