算法习题---线性表之数组实现循环移动

一:问题

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

二:思考

要实现R中序列循环左移P个位置,只需先将R中前P个元素逆置,再将剩下的元素逆置,最后将R中所有的元素再整体做一次逆置操作即可,本题算法描述如下:

(一)步骤一:将前P个元素逆置

(二)步骤二:将后P个元素逆置

(三)步骤三:将所有元素逆置(实现)

三:代码实现

void Reverse(int R[], int l, int r)
{
    int i, j;
    int temp;
    for (i = l, j = r; i < j; i++,j--)
    {
        temp = R[i];
        R[i] = R[j];
        R[j] = temp;
    }
}

void MoveL(int R[], int n, int p)
{
    if (p <= 0 || p >= n)
        return;
    Reverse(R, 0, p - 1);
    Reverse(R, p, n - 1);
    Reverse(R, 0, n - 1);
}
int main()
{
    int a[7] = { 1, 2, 3, 4, 5, 6, 7 };
    MoveL(a, 7, 3);
    for (int i = 0; i < 7; i++)
        printf("%d", a[i]);
    system("pause");
    return 0;
}

四:性能分析

时间复杂度是O(n),空间复杂度为O(1)

五:补充---右移

void MoveR(int R[], int n, int p)
{
    if (p <= 0 || p >= n)
        return;
    Reverse(R, 0, n - 1);
    Reverse(R, 0, p - 1);
    Reverse(R, p, n - 1);
}

六:总结左移和右移

(一)左移:将R中前p个元素逆置,剩下逆置,整体逆置

(二)右移:整体逆置,前p逆置,后p逆置

原文地址:https://www.cnblogs.com/ssyfj/p/9568757.html

时间: 2024-10-25 11:49:02

算法习题---线性表之数组实现循环移动的相关文章

算法习题---线性表之单链表逆序打印

一:题目 逆序打印单链表中的数据,假设指针指向单链表的开始结点 二:思路 1.可以使用递归方法,来进行数据打印 2.可以借助数组空间,获取长度,逆序打印数组 3.若是可以,对链表数据使用头插法,逆序排列,然后正序打印即可 三:算法实现(这里使用方法一:递归实现简单易懂) #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 #define OK 1 #def

算法习题---线性表之单链表的查找

一:问题 已知一个带头结点的单链表,结点结构为(data,link)假设该链表只给出了头指针list,在不改变链表的前提下,设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点(k为正整数),若查找成功,算法输出该结点的data域的值,并返回1,否则,只返回0. 注意: 这里的链表中没有给出链表长度哟 二:思路 设置两个指针p.q,分别指向该链表的第一个元素(头结点的下一个元素)和头结点,一个整数num(初值为1),p向后移动一个位置num值加1,如果num值大于k,则p,q一起移动,p移

C++数据结构与算法_1_线性表 --顺序表的实现与分析

顺序表的实现与分析 引 --线性表的抽象基类: template <typename T> class LinearList { public: LinearList(); ~LinearList(); virtual int Size() const = 0; //返回线性表所能够存储的最大长度 virtual int Length() const = 0; //当前线性表的长度 virtual int Search(T &x) const = 0; virtual int Loca

C++数据结构与算法_2_线性表 --顺序表的应用示例

h2.western { font-family: "Liberation Sans",sans-serif; font-size: 16pt; }h2.cjk { font-family: "微软雅黑"; font-size: 16pt; }h2.ctl { font-family: "AR PL UMing CN"; font-size: 16pt; }h1 { margin-bottom: 0.21cm; }h1.western { fon

线性表之数组描述

1.线性表的描述可以分为两种 数组描述:StaticList和DynamicList(动态数组) 链式描述 2.数组描述 数组描述方法将元素存储在一个数组中,通过一个索引以确定每个元素存储的位置 所有元素依次存储在一片连续的存储空间中 线性表中的每一个元素对应数组中的一个位置 3.创建一个数组类 要创建一个数组类必须确定数组类型和确定数组长度,所以针对以上两个问题有以下解决: 模板类 动态数组(数组空间不够的情况下动态增加数组长度) 4. StaticList类实现 使用原生数组作为顺序存储空间

数据结构与算法之线性表

前言 上一篇<数据结构和算法之时间复杂度和空间复杂度>中介绍了时间复杂度的概念和常见的时间复杂度,并分别举例子进行了一一说明.这一篇主要介绍线性表. 线性表属于数据结构中逻辑结构中的线性结构.回忆一下,数据结构分为物理结构和逻辑结构,逻辑结构分为线性结构.几何结构.树形结构和图形结构四大结构.其中,线性表就属于线性结构.剩余的三大逻辑结构今后会一一介绍. 线性表 基本概念 线性表(List):由零个或多个数据元素组成的有限序列. 注意: 1.线性表是一个序列. 2.0个元素构成的线性表是空表.

数据结构与算法之----线性表

01线性表 1.线性表的判断方式就是元素有且只有一个直接前驱和直接后继,元素可以为空,此时叫做空表 2.抽象数据类型标准格式 ADT 抽象数据类型名 DATA 数据元素之间逻辑关系的定义 Operation 操作 endADT 3.操作伪代码 Operation InitList(*L): 初始化操作,建立一个空的线性表L ListEmpty(L): 判断线性表是否为空表,如果为空返回true,否则返回false ClearList(*L): 将线性表清空(实际情况不是删除元素,而是将内存中的元

python web为什么要学数据结构与算法面试官为什么总问那几个算法和线性表二叉树

算法是什么? 举个简单的例子 当年刘景生病危刘琦被卷入继位之事 无奈求助于诸葛亮 以上古兵书为由 邀孔明阁楼相谈.... 诸葛亮曾说 那部阵书开篇就是阵法源自于心法 所以古代军师进步也是看兵法 算法也是同理 虽然我们作为web后端开发人员 但是每天所见所闻日子久也就适应了. 但是想要再进一步 两种方法 一 多看高质量代码 二 看算法 我们作为web开发可能算法运用的不是很多 每天也就是写接口调接口和产品经理撕 但是算法最重要的地方是会帮你扩充你的逻辑思维 可能刚看算法的人认为太难了我真学不来 举

数据结构、算法及线性表总结

思维导图 重要概念 数据:是能被输入进计算机中,并能被计算操作处理的对象的总称 数据元素:是数据结构中讨论的基本单位 数据类型:整型.浮点型.字符型等等变量所具有的不同的数据种类 存储结构:又称物理结构,是描述数据具体在内存中的存储结构,分为线性结构和非线性结构 逻辑结构:是描述数据之间的相互关系,分为线性结构(一对一).树形结构(一对多).图状结构/网状结构(多对多) 算法:时间复杂度表示算法执行时间与问题规模之间的关系,是对运算时间的一个大致估计:空间复杂度表示算法执行时占用的内存空间 线性