交换数组中的元素块

时间:2011-03-10 07:07:19

标签: c++ arrays

我正在研究C ++ ..我需要在数组中交换两个元素块。

说,{1,2,3,4,5,6}是我的输入数组..块{4,5}应该移到开头,输出数组应该像{4,5,1,2} ,3,6} ..我所拥有的是块{4,5}的起始索引和结束索引..为此我使用临时数组,将块单独复制到临时数组并将其移回到原始阵列,这是乏味的

但我相信使用memcpy或memmove会有更好的方法来实现这一点..任何想法?

2 个答案:

答案 0 :(得分:3)

有一种专门为此任务设计的标准算法std::rotate()

#include <algorithm>
#include <cstdio>

int main()
{
    int inputArray[] = {1, 2, 3, 4, 5, 6};
    ::printf("Before: ");
    for(int i = 0; i < 6; ++i)
    {
        ::printf("%d ", inputArray[i]);
    }
    ::printf("\n");

    int startIndex = 3; // refers to the number 4 in inputArray
    int endIndex = 5;   // refers one-past the number 5 in inputArray
    std::rotate(inputArray, inputArray+startIndex, inputArray+endIndex);

    ::printf("After: ");
    for(int i = 0; i < 6; ++i)
    {
        ::printf("%d ", inputArray[i]);
    }
    ::printf("\n");
}

预期产出:

  

之前:1 2 3 4 5 6

     

之后:4 5 1 2 3 6

std::rotate()通过std::swap()就地执行轮换,因此不涉及临时数组。

答案 1 :(得分:2)

Bentley的“Programming Pearls”描述了解决这个问题的三种算法。您可以在此处找到针对此特定问题的幻灯片

http://www.cs.bell-labs.com/cm/cs/pearls/s02b.pdf

例如,最简单的算法就是反转算法。只需反转需要交换的块,然后反转整个阵列。完成。

P.S。在您的示例中,“整个数组”代表1,2,3,4,5子序列(不包括6),因为这些是您需要交换的块。

反转块:

3, 2, 1, 5, 4

扭转整个事情

4, 5, 1, 2, 3