【算法集训之线性表篇】Day 06

文章介绍了如何设计一个在时间和空间效率上尽可能高的算法,将一维数组中的元素循环左移p个位置。方法是首先逆置整个数组,然后逆置前n-p个元素,最后逆置后p个元素,以达到预期的效果。代码实现中包含三个逆置函数的调用,并分析了时间复杂度和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目

设将n (n>1)个整数存放到一维数组R中,设计一个在时间和空间两方面尽可能高效的算法。将R中保存的序列循环左移p (0<p<n)个位置,即将R中的数据由(x0,x1,x2,…,xn-1)变换为(xp,xp+1,…,xn+1,x0,x1,…,xp-1),要求:

  1. 给出算法的基本设计思想。
  2. 根据设计思想,用C/C++实现算法,关键处给出注释。
  3. 说明算法的时间复杂度和空间复杂度。

基本设计思想

  1. 由上述要求,分析出题目主要要求实现数组R中元素循环左移p位,返回实现后数组。
  2. 因此,第一步我们可以先考虑将数组R内所有元素逆置,得到数组(xn-1,xn-2,…,x2,x1,x0)。
  3. 接下来,将数组R中前n-p个元素逆置,得到数组(xp,xp+1,…,xn-1,xp-1,xp-2,…x2,x1,x0)。
  4. 然后,再逆置数组R中后p个元素,得到题目要求数组(xp,xp+1,…,xn-1,x0,x1,…,xp-1)。

代码实现

Array LinearList::Reverse(int left,int right)//传入顺序表arr逆置的左右临界
{
    if(arr.length <= 1)
        return arr;

    int i = left,j = right-1;//设置哨兵i,j分别指向左右临界的下标
    int temp = 0;
    while(i < j)    //交换哨兵指向的元素位置
    {
        temp = arr.data[i];
        arr.data[i++] = arr.data[j];
        arr.data[j--] = temp;
        temp = 0;
    }
    return arr;
}

Array LinearList::Question_10(int p)
{
    if(arr.length <=1)//判断非法数组长度
        return arr;
    cout<<"Move "<<p<<" bit left"<<endl;
    Reverse(0,arr.length); //逆置数组R中的全部元素
    Reverse(0,arr.length-p);   //逆置数组R中前n-p个元素
    Reverse(arr.length-p,arr.length);  //逆置数组R中后p个元素

    return arr;
}

效果

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

葛狂的博客

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值