无法反转阵列

时间:2014-09-16 07:12:32

标签: c++ arrays algorithm reverse

这是我的代码:

#include <iostream>

using namespace std;

void reverse(int *, int);

int main()
{
    const int len = 10;
    int intArray[len] = {5, 6, 4, 1, 3, 10, 15, 13, 2, 7};
    reverse(intArray, len);
}

void reverse(int intArray[], int len)
{
    int j = len;
    for(int i = 0; i < len; i++)
    {
        --j;
        intArray[i] = intArray[j];
        cout << intArray[i] << " ";

    }
}

然后这是我的输出:

7 2 13 15 10 10 15 13 2 7

我看到一些代码做同样事情的例子,我想知道为什么他们都使用临时变量并且是否有必要?

此外,这个问题是MIT OCW任务的变体。虽然它们的赋值不需要打印出反转数组,但它们希望我们将反转值存储在原始数组中。但由于某种原因,他们的for循环只运行了一半的长度?这是他们的解决方案:

void reverse (int numbers [] , const int numbersLen ) 
{

for(int i = 0; i < numbersLen / 2; ++ i ) {

int tmp = numbers [ i ];

int indexFromEnd = numbersLen - i - 1;

numbers [ i ] = numbers [ indexFromEnd ];

numbers [ indexFromEnd ] = tmp ;

}

}

4 个答案:

答案 0 :(得分:2)

只需将标准算法std::reversestd::beginstd::end迭代器一起使用

#include <algorithm>
#include <iostream>

int main()
{
    const int len = 10;
    int intArray[len] = {5, 6, 4, 1, 3, 10, 15, 13, 2, 7};
    std::reverse(std::begin(intArray), std::end(intArray));

    for (auto&& e : intArray)
        std::cout << e << ", ";
}

Live Example

如果你必须编写自己的反向算法,这是一个可能的实现

template<class BidirIt>
void reverse(BidirIt first, BidirIt last)
{
    while ((first != last) && (first != --last)) {
        std::iter_swap(first++, last);
    }
}

此处std::iter_swap(a, b)只调用std::swap(*a, *b)。你当然可以提出自己的交换。

建议让算法采用迭代器对,以便与标准库的其余部分兼容。

答案 1 :(得分:1)

你保存所有&#34;逆转&#34;字节进入相同的数组覆盖原始元素。使用另一个空数组将结果保存到。

如果需要使用相同的数组,则可以交换相应的元素。对于交换,您需要临时变量并且只运行循环长度的一半。

答案 2 :(得分:1)

在反向功能中使用以下for循环:

int tmp;
for (int i = 0; i < len / 2; i++)
{
    --j;
    tmp = intArray[j];
    intArray[j] = intArray[i];
    intArray[i] = tmp;
}

然后从不同的循环打印数组。

答案 3 :(得分:0)

为了好玩,尝试手动反向算法并在单个循环中输出。

void reverse(int intArray[], int len)
{
    if (len <= 0)
        return;
    cout << intArray[len - 1] << " ";
    if (len == 1)
        return;
    reverse(intArray + 1, len - 2);
    int tmp = intArray[0];
    cout << tmp << " ";
    intArray[0] = intArray[len - 1];
    intArray[len - 1] = tmp;
}

tmp变量是交换两个值所必需的。否则,在第一次分配(=)时,您将丢失一些数据。