编程珠玑-向量旋转

#include <iostream>
using namespace std;
//将前i个元素复制到临时数组中
template<class T>
void func0(T a[],int len,int i){
    char *temp=new T[i];
    int j;
    for(j=0;j<i;j++){
        temp[j]=a[j];
    }
    for(j=0;j<len;j++)
        if(j<len-i)   a[j]=a[j+i];    
        else    a[j]=temp[(j+i)-len];        
    delete temp;
}
template<class T>
void my_swap(T& a,T& b){
    T temp;
    temp=a;
    a=b;
    b=temp;
}
template<class T>
void my_reverse(T a[],int f,int l){
   int i=f,j=l;
   while(i<j){
       my_swap(a[i++],a[j--]);
   }
}
//基于交换
template<class T>
void func2(T a[],int len,int i){
      my_reverse(a,0,i-1);
      my_reverse(a,i,len-1);
      my_reverse(a,0,len-1);
}
//移动i位
template<class T>
void func1(T a[],int len,int i){
    int g=1;//最大公约数
    for(int j=1;j<len && i;j++)
        if(len % j ==0 && i % j == 0 )
            g=j;
    for(int j=0;j<g;j++){      
         T temp=a[j];
         int l,r;
         l=j;
         while(true){
              r=l+i;
             if (r >= len)
                 r=r-len;
             if (r == j)
                 break;
             a[l]=a[r];
              l=r;
         }
        a[l]=temp;    
    }
}
int main(){
    char a[]="abcde233446878fgh";
    func0(a,17,7);
    cout<<a<<endl;
    char b[]="abcde233446878fgh";
    func1(b,17,7);
    cout<<b<<endl;
    char c[]="abcde233446878fgh";
    func2(c,17,7);
    cout<<c<<endl;
    system("pause");
    return 0;
}
posted @ 2014-05-18 21:50  sxcww  阅读(194)  评论(0编辑  收藏  举报