美文网首页pat
顺序表的循环左移

顺序表的循环左移

作者: 代号027 | 来源:发表于2016-05-19 21:12 被阅读560次

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

比如:长度为 8 的顺序表 (1, 2, 3, 4, 5, 6, 7, 8)(1,2,3,4,5,6,7,8),循环左移 3 位后的结果为 (4, 5, 6, 7, 8, 1, 2, 3)(4,5,6,7,8,1,2,3)。

样例输入

8 3
1 2 3 4 5 6 7 8

样例输出

4 5 6 7 8 1 2 3

算法分析

  • 通过偏移量将顺序表分为两部分
  • 创建一个临时数组存储偏移量右边的数据结构
  • 修改顺序表的排列顺序,让偏移量n以后的数据结构整体循环左移(向右移动)3位;
  • 将临时数组内保存的数据结构追加到顺序表之后(左移)

代码如下:

#include <iostream>

using namespace std;

class Vector{
private :
    int size, length;
    int *data;
public:
    Vector(int input_size)
    {   
        size = input_size;
        length = 0;
        data = new int[size];
    }   
    ~Vector()
    {   
        delete [] data;
    }   
    
    bool insert(int loc, int value)
    {   
        if(loc < 0 || loc > length)
        {
            return false;
        }
        if(length >= size)
        {
            return false;
        }
        for(int i=length; i>loc; --i)
        {
            data[i] = data[i-1];
        }
        data[loc] = value;
        length++;
        return true;
    }   
    
    bool remove(int index)
    {   
        if(index < 0 || index >= length)
        {
            return false;
        }
        for(int i=index+1; i<length; i++)
        {
            data[i-1] = data[i];
        }
        length--;
        return true;
    }   
    
    int search(int value)
    {   
       for(int i=0; i<length; i++)
       {
           if(data[i] == value)
           {
               return i;
           }
       }
       return -1;
    }

    void print()
    {
        for(int i=0; i<length; i++)
        {
            if(i>0)
            {
                cout << " ";
            }
            cout << data[i];
        }
        cout << endl;
    }

    void expand()
    {
        int *old_data = data;
        size *= 2;
        data = new int[size];
        for(int i=0; i<length; i++)
        {
            data[i] = old_data[i];
        }
        delete [] old_data;
    }

    bool move_left(int offset)
    {
        if(offset < 0 || offset >= length)
        {
            return false;
        }
        
        //开辟临时空间存储右半部分数据结构
        int* temp_data = new int[offset];
        for(int i=0; i<offset; i++)
        {
            temp_data[i] = data[i];
        }
        
        //将左半部分数据结构整体向右偏移3位
        for(int i=0; i<length-offset; i++)
        {
            data[i] = data[i+offset];
        }

        //将左半边数据结构整追加
        for(int i=length, j=offset; j>0; --i, --j )
        {
            data[i-1]= temp_data[j-1];
        }

        delete [] temp_data;
        return true;
    }
};

int main()
{
    int n,k,value;
    cin >> n;
    cin >> k;
    Vector vec(n);
    for(int i=0; i<n; i++)
    {
        cin >> value;
        vec.insert(i,value);
    }
    vec.move_left(k);
    vec.print();
    return 0;
}   

另一种思路:
减少一个for循环,重新开辟的内存空间较大:


 /*   bool move_left(int offset)
    {
        if(offset < 0 || offset >= length)
        {
            return false;
        }

        int* temp_data = data;
        
        data = new int[size];
        
        for(int i=0; i<length-offset; i++)
        {
            data[i] = temp_data[i+offset];
        }

        for(int i=length, j=offset; j>0; --i, --j )
        {
            data[i-1]= temp_data[j-1];
        }

        delete [] temp_data;
        return true;
    }
*/

相关文章

  • 顺序表的循环左移

    设将n(n>1)个整数存放到一维数组R中,试设计一个在时间和空间两方面都尽可能高效的算法,将R中保存的序列循环左移...

  • DS顺序表之循环移位

    题目描述 顺序表的移位是循环移位,例如顺序表:1,2,3,4,5,6。如果左移1位,即原来的头元素移动到末尾,其它...

  • 线性表之顺序表和链表(单/双链表,单/双循环链表)

    线性表按存储方式分为顺序表和链表两种,其中链表又分为单链表,循环链表,双链表,双向循环链表。 顺序表 顺序表采用顺...

  • 将数组元素循环移动p位,交换次数仅为n次

    算法思路 循环左移p位 数组序列长度为n,左移p位。 算法步骤 代码如下: 循环左移p位 数组序列长度为n,右移p...

  • 数组循环左移

    数组循环左移 本题要求实现一个对数组进行循环左移的简单函数:一个数组a中存有n(>0)个整数,在不允许使用另外数组...

  • 数据与算法结构

    线性表 顺序表 链表(物理上离散,逻辑上连续) 链表的类别 单链表 循环链表 双链表 链表的操作 顺序表与链表的比...

  • Java 移位运算

    左移 代表乘,左移一位代表乘2,左移两位代表乘4,左移n位代表乘以2的n次方,依次递增。 12<<1=24 12<...

  • 8086/8088 移位指令解释

    目录 非循环移位1.1 逻辑左移——SHL1.2 逻辑右移——SHR1.3 算术左移——SAL1.4 算术右移——...

  • 数据结构与算法(二,线性表的顺序存储结构,穷举法(冒泡和选择排序

    线性表 顺序表 顺序表的特性 顺序表的元素有前驱和后继 顺序表有size 顺序表的增删改查 顺序表的优缺点优点:尾...

  • 数据结构-单向链表

    一、线性表 线性表可以分为: 顺序表(数组) 链表(单向链表、双向链表、循环链表) 二、链表 链表是一种链式存储的...

网友评论

    本文标题:顺序表的循环左移

    本文链接:https://www.haomeiwen.com/subject/hgvgrttx.html