我正在编写代码,并且需要向左旋转多次数组。问题是我使用了for
循环。
当我需要在短数组中使用该函数时,速度很快。但是,一旦我使用包含10.000和更多元素的数组,由于for
循环,它的确很长。
所以我想知道是否还有另一种方法可以在C中旋转不需要for
或while
(或任何其他循环)的数组?
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;
}
答案 0 :(得分:2)
有没有一种方法可以在C语言中旋转数组而无需循环?
否。
数组存储在连续的内存中,因此任何移位都意味着线性访问其元素。
至少不清楚。我的意思是有Circular Buffer,它使用固定大小的缓冲区,但是它比数组复杂。例如,当缓冲区已满时,您需要用新元素覆盖最旧的元素。我想你不想那样。
我正在编写代码,并且需要向左旋转多次数组。
大喊使用简单的链接列表,而不是数组。
在列表的情况下,您只需要将节点从列表的开始移到列表的末尾即可。
如果您在Internet上搜索“向左旋转一个简单的链表”,则会发现许多示例。
答案 1 :(得分:1)
粘贴到数组:
如果您将缓冲区加倍并将数组复制到它自己的一端,则可以使用
void rotate_left(int **array, size_t size, size_t *shiftd){
if(++*shiftd >= size){
*shiftd %= size;
*array -= size;
}
++*array;
}
假设init()
函数的工作多次相同,可以像这样创建数组:
int *array = malloc(2 * size * sizeof(int));
init(array, size);
init(array + size, size);
size_t shiftd = 0;
并使用旋转功能
rotate_left(&array, size, &shiftd);
这应该说明转移的过程
array
v
[1|2|3|1|2|3]
------- size = 3, shiftd = 0
[1|2|3]
***rotate_left(&array, size, &shiftd);***
array
v
[1|2|3|1|2|3]
------- size = 3, shiftd = 1
[2|3|1]
***rotate_left(&array, size, &shiftd);***
array
v
[1|2|3|1|2|3]
------- size = 3, shiftd = 2
[3|1|2]
***rotate_left(&array, size, &shiftd);***
array
v
[1|2|3|1|2|3]
------- size = 3, shiftd = 0
[1|2|3]
但这不适用于零结尾的字符串。