数组循环左移
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})。
2.逆置余下n-p个元素;
3.逆置整个数组R。
采用此算法仅需要很少的额外空间,在时间和空间上都很高效,而且代码很短。
(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; }
相关文章推荐
- IT行业导览-目录
- Problem H
- leetcode Counting Bits
- 【自学笔记】 css 如何改变光标,及各种光标
- IOS开发之音效/音频播放
- IntelliJ IDEA 下载 安装
- 51nod(动态规划入门---最大子段问题)
- NodeJS + PhantomJS 抓取页面信息以及截图
- ViewPager实现Fragment懒加载
- Bzoj3834:[Poi2014]Solar Panels:数论,分块
- Linux基础命令(持续更新中)
- eclipse中查看项目有多少行代码
- 软件工程
- iOS中使用工厂模式定制cell
- C++中的堆和栈的完全解析
- Android App的设计架构:MVC,MVP,MVVM与架构经验谈
- 蓝桥杯 2016c/c++A组 题解
- XListView实现下拉刷新和上拉加载
- JAVA hashcode和equals为何要同时重写
- c++第2次作业