Algorithm 如何提高算法的效率?

Algorithm 如何提高算法的效率?,algorithm,recursion,swap,Algorithm,Recursion,Swap,我必须交换数组中的数字“d”次,这样才能完成数组的左旋转d'是数组的旋转次数。假设数组是1->2->3->4->5,如果d=1,那么在左旋转一圈后,数组将是2->3->4->5->1 我已使用以下代码执行上述操作: for (int rotation = 0; rotation < d; rotation++) { for (int i = 1; i < a.length; i++) { int bucket = a[i - 1]; a[i

我必须交换数组中的数字“d”次,这样才能完成数组的左旋转d'是数组的旋转次数。假设数组是1->2->3->4->5,如果d=1,那么在左旋转一圈后,数组将是2->3->4->5->1

我已使用以下代码执行上述操作:

for (int rotation = 0; rotation < d; rotation++) {
    for (int i = 1; i < a.length; i++) {

        int bucket = a[i - 1];
        a[i - 1] = a[i];
        a[i] = bucket;

    }
}
for(int-rotation=0;rotation
但该算法的效率太高,可能是O(n^d)最坏情况。如何提高算法的效率,尤其是在最坏的情况下

我正在寻找这个算法的递归方法。我想到了:


    public static void swapIt(int[] array, int rotations){


        for(int i=1; i<array.length; i++){
            int bucket = array[i-1];
            array[i-1] = array[i];
            array[i] = bucket;  
        }

          rotations--;  

        if(rotations>0){
            swapIt(array,rotations); 
        }

        else{

            for(int i=0; i<array.length; i++){
            System.out.print(array[i]+" "); 

            }

        }

    }


公共静态void swapIt(int[]数组,int旋转){
对于(int i=1;i0){
swapIt(阵列、旋转);
}
否则{

对于(inti=0;iKomplexity),在我看来,您的算法的复杂性类似于O(n*d)

我的方法不是旋转d次,而是旋转d次

可以通过以下方式计算元素的目标:

因此,与其
a[i-1]=a[i];
您可以这样做:

a[(i + a.length - d) % a.length] = a[i];
术语
(i+a.length-d)%a.length
处理您总是在间隔中获得值:
0…a.length-1

说明:


i+a.length-d
始终为正(只要d为n,则需要减少d.
d=d%a.length
以确保
(i+a.length-d)%a.length
在所需的区间
0…a.length-1
。结果是一样的,因为按a.length旋转就像什么都不做。

要加上@mrsmith42的答案,您可能应该检查
d
是否在范围
1内。该算法有递归方法吗?@CoderSam:我不推荐d递归解决方案。递归“总是”会带来性能损失(保留每个递归步骤的上下文…)。但当然,您可以采用您的算法并使外部循环成为递归。您可以始终将循环重构为原因递归;-)您可以始终使用循环数组,并始终迭代最多
length