jueves, 1 de diciembre de 2011

Rotate array k times in linear time

int gcd ( int a, int b )
{
  int c;
  while ( a != 0 ) {
     c = a; a = b%a;  b = c;
  }
  return b;
}


void shift(volatile int*arr, int len, int k){
    int i,j,c;
    int t1,t2;
    printf("gcd:%d\n",gcd(len,k));
    for(i=0;i<gcd(len,k);i++){
        j=k+i;
        if(j>=len)
            j-=len;
        t1 = arr[j];
        arr[j]=arr[i];
        while(j!=i){
            j+=k;
            if(j>=len)
                j-=len;
            t2 = arr[j];
            arr[j]=t1;
            t1=t2;
            printf("j:%d\n",j);
            for(c=0;c<len;c++)printf("%d,",arr[c]);
            printf("\n");
        }
        printf("i:%d\n",i);
    }
}