注册 登录
编程论坛 数据结构与算法

请大侠解释下这个算法

menghuann 发布于 2010-12-30 23:24, 654 次点击
设计一个时间复杂度为O(n)的算法,实现将数组A[n]中所有元素循环右移k个位置
就是那个Reverse函数如何递归调用和为什么是to-from还加1不是from-to?不是n=from,k=to吗?
只有本站会员才能查看附件,请 登录
5 回复
#2
诸葛修勤2011-01-01 09:02
这个算法是左移  不是右移
至于下面的一系列的问题 主要是数组下标是从零开始的

#include <stdio.h>

void Reverse( int A[], int from, int to )
{
    int temp;//临时缓冲区
    for(int i=0; i<(to-from+1)/2; ++i )
    {
        temp = A[from+i];
        A[from+i] = A[to-i];
        A[to-i] = temp;
    }
    return;
}

void Converse(int A[], int n, int k)
{
    Reverse(A, 0, k-1);
    Reverse(A, k, n-1);
    Reverse(A, 0, n-1);
    return;
}

int main()
{
    int A[]={1, 2, 3, 4, 5, 6};
    int i;
    Converse(A, 6, 1);

    for(i=0; i<6; ++i)
    {
        printf("%d ", A[i]);
    }
    printf("\n");

    return 0;
}
#3
诸葛修勤2011-01-01 09:06
这里 并没有用到递归

正如其函数的形式
算法分三步:
1。 选定从零下标开始的k个单元 进行前后调换位置
2。 选定剩下的n-k个单元 进行前后调换位置
3。 整体n个单元做一次前后位置的调换

完成上述3步则完成了循环左移懂k位的处理
#4
诸葛修勤2011-01-01 09:09
知道左移 右移的就没有多大的分别啦
#5
menghuann2011-01-20 20:39
我还是有2个疑问:
1 由调用函数和被调用函数可以知道,n=from,k=to,i<(to-from+1),那么k-n不就小于0了吗?
2 Revrse(A,0,k-1)具体是什么意思?
#6
menghuann2011-01-28 12:24
难道大侠不上网???
1