数组循环移动

本文介绍了一种通过三次逆序实现数组循环右移的高效算法,并提供了完整的Java代码实现。该算法的时间复杂度为O(n),能有效减少冗余移位次数。

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

数组循环右移可以把数组分成两份,第一部分是循环右移的数目,剩下的是另一部分
设要移动的为A,剩下的为B
那么这个数组的就是AB
循环移动后数组变成BA
实例:
AB = 0    1    2    3    4    5    6    7
A    =0    1    2
B    =3    4    5    6    7
我们需要实现的结果是
BA = 3    4    5    6    7    0    1    2

        对A逆序得 A1 =   2    1    0
        对B逆序得 B1 =   7    6    5    4    3 
                      A1B1 =   2    1    0    7    6    5    4    3 
        对A1B1逆序得 
                          3    4    5    6    7    0    1    2

由上面的移动过程我们可以看出,数组AB循环右移的步骤是:
    1、把数组按照移动的个数划分为两部分,将这两部分分别逆序
    2、将上一步得到的数组逆序
    完成这个算法就是进行3次逆序。(第一步两部分逆序的时间复习度O(n/2),第二步整个数组逆序也是O(n/2)
    因此整个算法的时间复杂度为O(n),n%total 可以减少冗余移位次数。

测试代码如下:
public static void main(String[] args) {

    int[] test = new int[10];
    for (int i = 0; i < 10; i++) {
        test[i] = i;
    }
    cyclerShift(test, 2);
    for (int e : test) {
        System.out.print(e + " ");
    }
}

private static void cyclerShift(int[] arr, int n) {
    int total = arr.length;
    n = n % total;
    if (n == 0 || arr == null)
        return;
    reverse(arr, 0, n-1);
    reverse(arr, n, total - 1);
    reverse(arr, 0, total - 1);
}

private static void reverse(int[] arr, int begin, int end) {
    int n = (end + 1 - begin) / 2;
    for (int i = 0; i < n; i++)
        swap(arr, begin++, end--);
}

private static void swap(int[] arr, int i, int j) {    
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值