zoukankan      html  css  js  c++  java
  • 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  }
  • 相关阅读:
    Linux openkvm disk expansion
    FineReport 交叉报表
    Linux crontab 查看所有用户的crontab任务
    Nginx 配置操作注意事项
    MYSQL Packet for query is too large (12054240 > 4194304). You can change this value on the server by setting the max_allowed_packet' variable.
    Navicat Premium 12 mysql show error: connection is being used
    SpringMVC RequestLoggingFilter log to file
    JEECG MiniDao优劣
    网站安全统一监测平台(WebPecker)
    Spring @Transactional at interface
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13322103.html
Copyright © 2011-2022 走看看