数组循环移位

将一个含有n个元素的数组向右循环移动k位,要求时间复杂度是O(n),且只能使用两个额外的变量.


分析:比如数组 1 2 3 4循环右移1位 将变成 4 1 2 3, 观察可知1 2 3 的顺序在移位前后没有改变,只是和4的位置交换了一下,所以等同于1 2 3 4 先划分为两部分1 2 3 | 4,然后将1 2 3逆序,再将4 逆序 得到 3 2 1 4,最后整体逆序 得到 4 1 2 3

很久没用c++了,有时候写算法还是用用c++,也随便练习一下。
 


#include 


void Reverse( int buffer[], int start, int end )
{
    while ( start < end )
    {
        int temp = buffer[ start ] ;
        buffer[ start++ ] = buffer[ end ] ;
        buffer[ end-- ] = temp ;
    }
}


void Shift( int buffer[], int n, int k )
{
    k %= n ;
    
    Reverse( buffer, 0, n - k - 1) ;
    Reverse( buffer, n - k, n - 1 ) ;
    Reverse( buffer, 0, n - 1 ) ;
}

int main(int argc, const char * argv[]) {
    // insert code here...
    
    int buffer [6] =  {1, 2, 3, 4, 5, 6};
    
    for(int i = 0; i < 6; i ++)
        std::cout << buffer[i];
    Shift(buffer, 6, 2);
    
    std::cout << std::endl;
    
    for(int i = 0; i < 6; i ++)
        std::cout << buffer[i];
    
    std::cout << std::endl;
    
    return 0;
}

 


123456
561234
Program ended with exit code: 0

 

你可能感兴趣的:(算法)