您的位置:首页 > 其它

数组循环位移 三种

2015-09-01 10:02 274 查看
#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.王晓东 《算法设计与分析》第三版
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: