比方说,我有一个数组a的长度n和第二阵列indices还长,n。 indices包含序列的任意排列[0, n)。我想重新排列a,使其按所指定的顺序indices。例如,使用D语法:
a
n
indices
[0, n)
auto a = [8, 6, 7, 5, 3, 0, 9]; auto indices = [3, 6, 2, 4, 0, 1, 5]; reindexInPlace(a, indices); assert(a == [5, 9, 7, 3, 8, 6, 0]);
是否可以在O(1)空间和O(n)时间中都做到这一点,最好不要突变indices?
使用mutating indices:(。看起来很难(请参阅稳定的就地mergesort)。
a = [8, 6, 7, 5, 3, 0, 9] indices = [3, 6, 2, 4, 0, 1, 5] for i in xrange(len(a)): x = a[i] j = i while True: k = indices[j] indices[j] = j if k == i: break a[j] = a[k] j = k a[j] = x print a