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