数组元素循环左移
理论
循环左移pos位,即将数组中的每个元素下标向前移动pos位,其中前面没有位置的数组元素循环移位到数组的末尾
如下图,长度为4的数组循环左移一位,即a1-a3分别移位到数组的第1-3位,而a0则移位到第4位
而我们今天要谈的是【将一维数组中的元素循环左移P个元素】
题目大致如下:设将n(n>1)个整数存放到一维数组R中,设计一个算法,将R中的序列循环左移P(0<P<n)个位置,即将R中的数据由{X0,X1,…,Xn-1}变换为{Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1}
这里就要用到一个算法结论,即
从{X0,X1,…,Xn-1}变换为{Xp,Xp+1,…,Xn-1,X0,X1,…,Xp-1}需要3步:
(1){X0,X1,…,Xp-1}数组前部分逆转位置
(2){Xp,Xp+1,…,Xlen-1}数组后一部分逆转位置
(3){X0,X1,…,Xlen-1}整个数组逆转位置
从而我们可以将这种思想归纳为函数cycleLeft(int arr[],int len,int pos)
鉴于逆转的操作比较独立且语句不少,因而我们单独为其构造一个reverse(int arr[],int begin,int end)逆转函数
逆转数组元素如下图所示,需要引入一个过渡变量temp暂存要转换的其中一个元素
代码
//数组元素循环左移
#include <iostream>
#include <cmath>
#include <cstring>
using namespace std;
//逆置代码
void reverse(int arr[],int begin,int end){
int i,j;
for(i = begin,j = end;i < j;i++,j--){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//循环左移代码,arr为操作数组,len为数组长度,pos为为移动位数
void cycleLeft(int arr[],int len,int pos){
reverse(arr,0,pos-1);
reverse(arr,pos,len-1);
reverse(arr,0,len-1);
}
int main(){
int len,arr[1010];
cout<<"请输入数组长度与数据:"<<endl;
cin>>len;
for(int i=0;i<len;i++){
cin>>arr[i];
}
cout<<"循环左移之前的数组为:";
for(int i=0;i<len-1;i++){
cout<<arr[i]<<" ";
}
cout<<arr[len-1]<<endl;
cout<<"请输入循环左移的位数:";
int CLnum;
cin>>CLnum;
cycleLeft(arr,len,CLnum);
cout<<"循环左移之后的数组为:";
for(int i=0;i<len-1;i++){
cout<<arr[i]<<" ";
}
cout<<arr[len-1]<<endl;
return 0;
}