知乎上有相关讨论: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)