数组循环位移 三种

本文深入探讨了C++中数组循环移位的多种算法实现方式,包括直接赋值法、逆序法、分段逆序法、递归法和迭代法,并通过代码示例详细阐述了每种方法的原理、步骤和性能优化技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#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.王晓东 《算法设计与分析》第三版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值