C++ 数组的普通移位和循环移位


普通移位:

若数组想从某一位开始向右移n位,一般是从数组的最后一位开始逐次向右移位。

程序如下:

 1 #include <iostream>
 2 #include <stdlib.h>
 3 using namespace std;  4 int s[11]={1,2,3,4,5,6,7,8,9,0};  5 void main()  6 {  7     for (int i=0;i<11;i++)  8  {  9         cout<<s[i]; 10  } 11     cout<<endl; 12     //移位代码,此地假设向右移移位
13     for (int j=10;j>0;j--) 14  { 15         s[j]=s[j-1]; 16  } 17     for (int k=0;k<11;k++) 18  { 19         cout<<s[k]; 20  } 21     cout<<endl; 22 }

程序运行结果截图:

  

循环移位,下面是自己编的一个:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;  4 int s[10]={1,2,3,4,5,6,7,8,9,0};  5 void main()  6 {  7     int temp;  8     //向右循环移位3位
 9     for(int i=1;i<=3;i++) 10  { 11         temp=s[9]; 12         for(int j=9;j>=1;j-- ) 13  { 14             s[j]=s[j-1]; 15  } 16         s[0]=temp; 17  } 18     for(int k=0;k<=9;k++) 19  { 20         cout<<s[k]; 21  } 22 }

其实原理就是通过一个间接的变量,对数组进行移位。假设数组长度为N,需要循环右移K次,则算法的复杂度为O(K*N),当K>N时算法的复杂度甚至大于O(N^2)。

运行结果图:

通过分析可以发现,K>N时所移动的位数和K'=K%N相同,如是衍生出如下算法:

 1 #include<iostream>
 2 #include<stdlib.h>
 3 using namespace std;  4 int s[10]={1,2,3,4,5,6,7,8,9,0};  5 void main()  6 {  7     int temp;  8     int K,KK;  9     K=99; 10     //向右循环移位K位
11     KK=K%10;//数组长度为10
12     for(int i=1;i<=K;i++) 13  { 14         temp=s[9]; 15         for(int j=9;j>=1;j-- ) 16  { 17             s[j]=s[j-1]; 18  } 19         s[0]=temp; 20  } 21     for(int k=0;k<=9;k++) 22  { 23         cout<<s[k]; 24  } 25     cout<<endl; 26 }

运行结果略。

在网上找到一种复杂度为:O(N)的方法,原理如下:

假设原序列为:abcd1234

移位4位后为:1234abcd

移位过程可以表示成如下步骤:

逆序排列abcd:dcba1234

逆序排列1234:dcba4321

逆序排列dcba4321:1234abcd

也就是说需要编写一个逆序函数,并进行三次逆序变换。

代码如下:

 1   #include<iostream>
 2   #include<stdlib.h>
 3   using namespace std;  4   void Reverse(int *arr,int b,int e);  5   int s[10]={1,2,3,4,5,6,7,8,9,0};  6   void main()  7  {  8       int k,kk,N;  9       N=10; 10      k=99; 11      kk=k%10; 12      //下面为循环移位部分
13      Reverse(s,0,N-kk-1); 14      Reverse(s,N-kk,N-1); 15      Reverse(s,0,N-1); 16      //显示
17      for(int i=0;i<=9;i++) 18  { 19          cout<<s[i]; 20  } 21      cout<<endl; 22  } 23  void Reverse(int *arr,int b,int e) 24  { 25      int temp; 26      for(;b<e;b++,e--) 27  { 28          temp=arr[e]; 29          arr[e]=arr[b]; 30          arr[b]=temp; 31  } 32  }

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM