如何在适当的位置对阵列进行洗牌

时间:2012-10-14 21:08:03

标签: arrays algorithm shuffle

有一个奇数和偶数相等的数组。数字不按特定顺序存储。是否有可能在适当的位置(O(1)额外空间)对数组进行洗牌,以便将偶数引导到偶数索引,将奇数引导到奇数索引?

使用辅助存储实现当然是微不足道的,不使用辅助存储的约束使其变得困难。此外,没有模式,在将数组[a1,a2,a3..an,b1,b2...bn...n1,n2,n3...nn]混合到[a1,b1,c1..n1,a2,b2,c2...n2,...an,bn...nn]等问题中,有一个固定的映射,这使得人们可以执行此操作。但是这里没有这样的模式,它可以做到吗?

2 个答案:

答案 0 :(得分:2)

编写两个迭代器。一个在偶数位置迭代奇数的所有数组索引。另一个迭代奇数位置的所有偶数。

同时迭代两者,并交换迭代器指向的项,直到数组结束。应该有O(n)表现。

答案 1 :(得分:1)

保留两个索引,一个用于奇数,一个用于平均,并且总是找到第一个奇/偶内容的偶数/奇数索引,然后交换:

int even = 0, odd = 1;
do {
    while(even < size && array[even] % 2 == 0) even += 2;
    while(odd < size && array[odd] % 2 == 1) odd += 2;
    if (even < size && odd < size) {
        int temp = array[even];
        array[even] = array[odd];
        array[odd] = temp;
    }
}while(even < size && odd < size);