您的位置:首页 > 其它

数组循环左移

2016-03-22 20:59 295 查看
设将n(n>1)个整数存放到一维数组R中。设计一个在时间和空间两方面尽可能高效的算法。将R中保存的序列循环左移p(0<p<n)p(0位置,即将R中的数据由(X0,X1,……,Xn−1)(X_0,X_1,……,X_{n-1})变换为

(Xp,Xp+1,......,Xn−1,X0,X1,......,Xp−1)(X_p,X_{p+1},......,X_{n-1},X_0,X_1,......,X_{p-1})。

传统的解决方法

首先将前p个元素复制到一个临时数组中,然后将余下的n-i元素向左移动p个位置,最后将最初的p个元素从临时数组中复制到R中余下的位置。这种方法使用了i个额外的位置产生了较大的存储空间的消耗。

我们使用的方法

1.首先逆置数组前p个元素;

2.逆置余下n-p个元素;

3.逆置整个数组R。

采用此算法仅需要很少的额外空间,在时间和空间上都很高效,而且代码很短。

#include<stdio.h>
#define N 5
#define OK 1;
void reverse(int R[],int i,int j) //逆置数组小标为i到第j的元素
{
int temp;
for(;i<j;i++,j--)
{
temp=R[i];
R[i]=R[j];
R[j]=temp;
}
}
int A(int R[],int p,int n)//将含有n个元素的数组循环左移p位
{
reverse(R,0,p-1);
reverse(R,p,n-1);
reverse(R,0,n-1);
return OK;
}
int main()
{
int R
;
int i,p;
printf("请输入%d个数\n",N);
for(i=0;i<N;++i)
scanf("%d",&R[i]);
printf("请输入数组循环左移位数\n");
scanf("%d",&p);
if(p<0||p>N)
{
printf("输入数据p不合法");
return 0;
}
A(R,p,N);
printf("左移之后的数组如下\n");
for(i=0;i<N;++i)
printf("%d ",R[i]);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: