在没有for的情况下在C中向左旋转数组?

时间:2018-11-30 10:32:48

标签: c for-loop time rotation

我正在编写代码,并且需要向左旋转多次数组。问题是我使用了for循环。

当我需要在短数组中使用该函数时,速度很快。但是,一旦我使用包含10.000和更多元素的数组,由于for循环,它的确很长。

所以我想知道是否还有另一种方法可以在C中旋转不需要forwhile(或任何其他循环)的数组?

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;
}

2 个答案:

答案 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]

但这不适用于零结尾的字符串。