是否有一种有效且安全的方法来反转数组中的所有元素?

时间:2012-08-19 16:36:37

标签: c arrays

我需要反转大型数组,使第一个元素成为最后一个元素,最后一个元素成为第一个元素。

到目前为止,我通过创建此数组的副本,然后向后迭代原始数据并写入副本来完成此操作。之后,将副本写回原始文件。

是否可以通过同时访问第一个和最后一个元素在一个循环中安全地执行此操作,将其中一个元素存储在temp var中并交换值?

4 个答案:

答案 0 :(得分:8)

可能最有效的方法是使用就地算法,例如下面的那个(相当于维基百科文章here中的那个):

for (int ix = 0; ix < len / 2; ix++) {
    int t = arr[ix];
    arr[ix] = arr[len - ix - 1];
    arr[len - ix - 1] = t;
}

答案 1 :(得分:3)

对于整数类型,更好的方法是......

int arr[5]={1,2,3,4,5};
int c=0,d=sizeof(arr)/sizeof(*arr)-1;
for(;c<d;c++)
{  
 arr[c] ^= arr[d-c];
 arr[d-c] ^= arr[c];
 arr[c] ^= arr[d-c];
}

因为XOR是一个字节指令,所以沿交换线几乎不需要3个字节。

答案 2 :(得分:2)

int Array[100];

unsigned int i, j;
for (i=0, j=100-1; i<j; i++, j--)
{
   int t;
   t = Array[j];
   Array[j] = Array[i];
   Array[i] = t;
}

答案 3 :(得分:0)

您可以使用 reverse() 函数或 我认为这将是非常简单的解决方案

#include<iostream>
using namespace std;
int main() {
int n;
cin>>n;
unsigned int arr[n];
for(int i = 0; i < n; i++)
{
    cin>>arr[i];
}
while(n)
{
    cout<<arr[n-1]<<" ";
    n--;
}
return 0;

}