编程论坛
注册
登录
编程论坛
→
数据结构与算法
请大侠解释下这个算法
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
menghuann
2011-01-20 20:39
我还是有2个疑问:
1 由调用函数和被调用函数可以知道,n=from,k=to,i<(to-from+1),那么k-n不就小于0了吗?
2 Revrse(A,0,k-1)具体是什么意思?
#6
menghuann
2011-01-28 12:24
难道大侠不上网???
1