我正在寻找一种方法来重新排序给定范围,以获得第一个,最后一个,中间一个,然后是中间的中间部分......等等。如果我们看看0-15范围,它将是这样的:所以邻居成员只会在最后一次迭代时出现。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 15 8 4 12 2 6 10 13 1 3 5 7 9 11 14
对于一个好算法的任何想法?
这是一个使用队列而不是递归的解决方案。
13和14的位置与你的例子不同,但是如果你一直认为偶数长度列表的中间是中间的元素,那么14首先是:
import collections
def reorder(seq):
'''Yield items from seq reordered to http://stackoverflow.com/q/33372753/
seq can be any sequence, eg. a list or a Python 3 range object.
'''
# output first and last element before all the middles
if seq:
yield seq[0]
if len(seq) > 1:
yield seq[-1]
# a queue of range indices (start, stop)
queue = collections.deque([(1, len(seq)-1)])
while queue:
start, stop = queue.popleft()
if start < stop:
middle = (start + stop) // 2
yield seq[middle]
queue.append((start, middle))
queue.append((middle+1, stop))
print(list(reorder(range(16))))
#[0, 15, 8, 4, 12, 2, 6, 10, 14, 1, 3, 5, 7, 9, 11, 13]