转载-数组循环移位

数组循环移位算法详细介绍:http://blog.chinaunix.net/uid-26642637-id-3291386.html

方法1

利用memcpy函数,需开辟临时空间。先把从a+n-k到a+n-1这k个字符,存到tmp中;然后,把以a开始的地址空间中的字符复制到a+k开始的地址空间中去;最后,把tmp的k个字符放回以a开始的地址空间中去。
 
 a  ... a+n-k-1  a+n-k   ...  a+n-1
 

void loopRightShiftV2(char a[], int n, int k)
{
    char *tmp = (char *)malloc(sizeof(char)*k);

    k %= n;
    memcpy(tmp, a+n-k, k);
    memcpy(a+k, a, n-k);
    memcpy(a, tmp, k);
}


「方法1版本2
先看循环右移一个字符的思路:首先,保存最有一个非''字符;然后将字符数组从最后一个非''字符开始,依次后移;最后将已保存的最后一个字符放到第一字符所在位置处。循环右移k个字符,只需将上述过程重复k次即可。
 

void loopRightShift(char a[], int n, int k)
{
    int tmp;
    int i;

    k %= n;
    while(k--){
        tmp = a[n-1];
        for(i = n-1; i >0; i--){
            a[i] = a[i-1];
        }
        a[0] = tmp;
    }
}

方法2

转载自:http://blog.csdn.net/zz198808/article/details/7539827

// Perverse.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
void Reverse(char a[],int begin,int end)
{
    for (;begin<end;begin++,end--)
    {
        char temp=a[end];
        a[end]=a[begin];
        a[begin]=temp;
    }
}
void RightShift(char *array,int N,int K)
{
    K%=N;
    Reverse(array,0,N-K-1);
    Reverse(array,N-K,N-1);
    Reverse(array,0,N-1);

}
void LeftShift(char* array,int N,int K)
{
    K%=N;
    Reverse(array,K,N-1);
    Reverse(array,0,K-1);
    Reverse(array,0,N-1);
}

int _tmain(int argc, _TCHAR* argv[])
{
    char a[]="abcd1234";

    /*Reverse(a,1,2);
    for (int i=0;i<5;i++)
    {
        printf("%3c ",a[i]);
    }
    system("pause");*/
    LeftShift(a,8,2);

    for (int i=0;i<8;i++)
    {
        printf("%c",a[i]);
    }
    system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/lwflourish/p/4494749.html