首页 > 试题广场 >

设计算法左移元素

[问答题]

设将n(n > 1)个整 存放到一维数组R中。 一个在时间和空间两方面 尽可能高效的算法 将R中 存有 的序列循环左移P(0 < P < n)个位置,即将R中的数据由(X 0 ,X 1 ,…X n-1 )变换为(X p ,X p + 1 …X n-1 ,X 0 ,X 1 …X p-1 ) 要求
(1)给出算法的基本 设计 思想。
⑵按照 设计 思想,采用C或C++或JAVA语言描述算法,关键 之处 给出注释。

(3)说明你所 设计 算法的时间复杂度和空间复杂度。

(1)给出算法的基本设计思想:
先将这n 个元素的数据序列( X 0 X 1 ... X p X p+1 ... ,x n -1 )原地逆置,得到( X n-1 ,...,X p ,X p-1 ,...,X 0 ),然后再将前n - p 个元素( X n -1 ... X p )和后p 个元素( X p -1 ... X 0 )分别原地逆置,得到最终结果( X p X p+1 ... X n X 0 X 1 ... X p -1 )。
(2)算法实现:

算法可以用两个函数,即Reverse()和 LeftShift()实现相应的功能,后者调用 Reverse()函数三次。

算法如下:

 
发表于 2016-11-19 16:13:32 回复(0)
#include <iostream>

using namespace std;

int main()
{
    int n;
    cout<<"输入数组元素个数"<<endl;
    cin>>n;
    int a[n];
    cout<<"输入数组元素"<<endl;
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    cout<<"当前数组"<<endl;
    for(int i=0;i<n;i++){
        cout<<a[i]<<" ";
    }

    int m;
    cout<<"输入循环左移的位数"<<endl;
    cin>>m;
    if(m>n){
        cout<<"error"<<endl;
        return 1;
    }
    int temp[m];
    for(int i=0;i<m;i++){
        temp[i]=a[i];
    }
    cout<<"临时temp数组"<<endl;
    for(int i=0;i<m;i++)
    {
        cout<<temp[i]<<" ";
    }
    cout<<endl;

    for(int i=m;i<n;i++){
        a[i-m]=a[i];//数组元素向前挪动m个位置
    }
    cout<<"前挪动后的数组"<<endl;
    for(int i=0;i<n;i++){
        cout<<a[i]<<" ";
    }
    cout<<endl;

    for(int i=n-m,j=0;i<n&&j<m;i++,j++){
        a[i]=temp[j];//临时数组元素放回后m个位置
    }
    cout<<"循环左移后的数组元素:"<<endl;
    for(int i=0;i<n;i++){
        cout<<a[i]<<" ";
    }
    return 0;
}

/*时间复杂度:o(n),空间复杂度:o(n)
方法:暴力分配前挪位置,再回填数组。*/

发表于 2021-03-01 14:27:43 回复(0)