一尘不染

就地数组重新排序?

algorithm

比方说,我有一个数组a的长度n和第二阵列indices还长,nindices包含序列的任意排列[0, n)。我想重新排列a,使其按所指定的顺序indices。例如,使用D语法:

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


阅读 208

收藏
2020-07-28

共1个答案

一尘不染

使用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
2020-07-28