如何为n个位置循环移位数组

时间:2015-02-20 22:35:50

标签: c arrays

#include <stdio.h>
#include <stdlib.h>
#define MAX 10

int main()
{
    int niz[MAX], i, pom; 


// two more var, n,m=0;

char c;

for(i=0;i<MAX;i++)
{
    niz[i]=rand()%100;
}
for(i=0;i<MAX;i++)
{
    printf("%d\n", niz[i]);
}


printf("\n\nEnter L(l) for left shift or R(r) for right shift\n");
scanf("%c", &c);

if(c=='L' || c=='l')
{

//while(m<n) and on the end n++; or for(m=0;m<n;m++)... you know what i mean 
//but its not working...


    pom=niz[0];
    for(i=0;i<MAX-1;i++)
    {
        niz[i]=niz[i+1];
    }
    niz[MAX-1]=pom;


    //for loop to shift array for 1 position
}

else if(c=='R' || c=='r')
{

//.....

    pom=niz[MAX-1];
    for(i=MAX-1;i>0;i--)
    {
        niz[i]=niz[i-1];
    }
    niz[0]=pom;
    //for loop to shift array for 1 position
}

for(i=0;i<MAX;i++)
{
    printf("%d\n", niz[i]);
}
return 0;
}

好的,这是将数组向左或向右移动1个位置的代码,它工作正常。但是,如果我想为n位置移位数组,我首先想到的只是将IF和ELSE IF中的代码放在一个循环中,这将重复直到某个变量增加到小于n,我尝试从IF和ELSE IF中放入代码虽然和for循环,但它没有工作..顺便说一下,我的方法是替换n位置的数组......?

2 个答案:

答案 0 :(得分:1)

我的基本想法是复制原始数组,然后根据移位索引将数组元素设置到副本中。在获得n的值和转换方向(以及任何错误检查)之后,这是我的方法:

if(toupper(c)=='L')
{
    n = -n;
}

for(i=0;i<MAX;i++)
{
    copy[i] = niz[i];
}

for(i=0;i<MAX;i++)
{
    shift_i = (i+n+MAX) % MAX;
    niz[i]=copy[shift_i];
}

由于n可能是负数,因此我在获取模数之前将数组的长度添加到它。就地转移会更有效率,但我还没想出来。您需要以某种方式跟踪原始值。

答案 1 :(得分:1)

如果您正在处理数组,则需要至少复制一次每个元素。

让我们调用S作为数组的大小。

最省时的方法是将数组拆分为两个连续的部分,将最小的数组复制到一个临时存储(长度最多为S / 2),将最大的块移动到位,然后复制回来它所属的最小块。
这将需要最多3S / 2份。

最节省空间的是逐个交换元素,只需要一个元素进行临时存储,但这样会更慢(你会失去块副本的好处)。