数组循环位移 三种

来源:互联网 发布:淘宝立即购买图标 编辑:程序博客网 时间:2024/05/16 10:56
#include <iostream>using namespace std;/*void RightShift1(char *arr, int N, int k){    while(k--){        char t = arr[N-1];        for(int i = N-1; i > 0; i--)            arr[i] = arr[i-1];        arr[0] = t;    }}*/void RightShift1(int *arr, int N, int k){    k %= N;    while(k--){        char t = arr[N-1];        for(int i = N-1; i > 0; i--)            arr[i] = arr[i-1];        arr[0] = t;    }}void Reverse(int *arr, int b, int e){    for(; b < e; b++, e--){        char temp = arr[e];        arr[e] = arr[b];        arr[b] = temp;    }}void RightShift2(int *arr, int N, int k){    k %= N;    Reverse(arr, 0, N-k-1);    Reverse(arr, N-k, N-1);    Reverse(arr, 0, N-1);}// 数组的循环移位#include <cstdio>int gcd(int m, int n) {if(n==0)        return m;    return gcd(n,m%n);}void RightShift3(int a[],int n,int k){    k=n-(k%n);//右移k位  等价于左移-k位,-k = n - k(mod n)    for(int i=0,len=gcd(n-k,k);i<len;i++){        int t=a[i],p=i,j=(i+k)%n;        while(j!=i){            a[p]=a[j],p=j,j=(p+k)%n;        }        a[p]=t;    }}void RightShift4(int a[],int n,int k){    k=(k%n);//leftshift    for(int i=0,len=gcd(n-k,k);i<len;i++){        int t=a[i],p=i,j=(i+k)%n;        while(j!=i){            a[p]=a[j],p=j,j=(j+k)%n;        }        a[p]=t;    }}void printArray(int A[], int n) {for(int i = 0; i < n; i++) {printf("%-3d", A[i]);}printf("\n");}int main() {int A[] = {1,2,3,4,5,6,7};RightShift4(A, 7, 1);printArray(A, 7);RightShift3(A, 7, 2);printArray(A, 7);RightShift2(A, 7, 3);printArray(A, 7);RightShift1(A, 7, 5);printArray(A, 7);return 0;}


参考资料  1.王晓东 《算法设计与分析》第三版

0 0