【发布时间】:2018-11-30 10:32:48
【问题描述】:
我正在编写代码,我需要多次向左旋转数组。问题是我使用了for 循环。
当我需要使用带有短数组的函数时,它很快。但是,一旦我使用包含 10.000 个或更多元素的数组,由于for 循环,它真的很长。
所以我想知道是否有另一种方法可以在不需要for 或while(或任何其他循环)的C 中旋转数组?
void rotate_left(int *array, int size)
{
int nb = array[0];
for (int i = 0; i < size; i++) {
array[i] = array[i + 1];
}
array[size - 1] = nb;
}
【问题讨论】:
-
这是你应该使用链表而不是数组的地方。然后只需将一个节点从列表的开头移动到结尾即可。
-
数组的问题是它们在内存中连续存储。因此,将其向左移动/旋转意味着接触所有元素。对于许多移位/旋转查询和大型数组来说,这会变得很慢。正如@Lundin 所说:链表更适合此任务并且在恒定时间内运行(如果您可以访问头部和尾部)。
-
好的,我试试,谢谢!
-
这种数据数组通常被编码为循环缓冲区(参见en.wikipedia.org/wiki/Circular_buffer),通过简单地更新头和尾指针,所有访问都可以非常快速地进行。
-
你的轮换方式不对:
int rot[5]={1,2,3,4,5}; rotate_left(rot,2);输出:rot[0]:2 rot[1]:1 rot[2]:3 rot[3]:4 rot[4]:5