我正在研究C ++ ..我需要在数组中交换两个元素块。
说,{1,2,3,4,5,6}是我的输入数组..块{4,5}应该移到开头,输出数组应该像{4,5,1,2} ,3,6} ..我所拥有的是块{4,5}的起始索引和结束索引..为此我使用临时数组,将块单独复制到临时数组并将其移回到原始阵列,这是乏味的
但我相信使用memcpy或memmove会有更好的方法来实现这一点..任何想法?
答案 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)
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