1、最简单的算法借助于一个n元的中间向量在n步时间内完成

时间复杂度:O(n)  空间复杂度O(n)

 void shift_easy(int arr[], int _arr[], int n, int i){
int j = ; while(i < n){
_arr[j++] = arr[i++];
}
i = ;
while(j < n){
_arr[j++] = arr[i++];
} }

2、使用翻转的思路完成一个不需要额外空间、编写简单并且实际运行很快的算法

时间复杂度:O(n)

 void swap(int arr[], int i, int j){
int temp;
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
} void reverse_shift(int arr[], int n, int i){
int j , k; j = ;
while(j < (i - j - )){
swap(arr, j, i- j- );
j++;
}
j = i;
k = ;
while(j < (n - k - )){
swap(arr, j, n - k -);
j++;
k++;
}
j=;
while(j < (n - j - )){
swap(arr, j, n - j -);
j++;
}
}

3、在O(n)时间内完成、不需要额外空间的杂技算法

原理是:将x[0]移动到t,将x[i]移动到x[0],将x[2i]移动到x[i](将x的下标对n取模),直到返回取x[0]中的元素,此时改为从t取值并停止过程。如果该过程没有移动全部元素,就从x[1]开始再次移动,直到所有的元素都移动为止。

 int gcd(int a, int b){
int temp;
if(b == )
return a;
do{
temp = a % b;
a = b;
b = temp;
}while(b != );
return a;
} void acrob_shift(int arr[], int n, int rotdist){
int j, k, i, temp; for(i = ; i < gcd(rotdist, n); i++){
temp = arr[i];
j = i;
while(){
k = j + rotdist;
if(k >= n)
k -= n;
if(k == i)
break;
arr[j] = arr[k];
j = k;
}
arr[j] = temp;
}
}

4、块交换算法(效率最高)

 void swap_block(int arr[], int sp1, int sp2, int s){
int temp;
while(s > ){
temp = arr[sp1 + s -];
arr[sp1 + s - ] = arr[sp2 + s - ];
arr[sp2 + s - ] = temp;
s--;
}
} void block_shift(int arr[], int n, int rotdist){
int i, j, p;
if(rotdist == || rotdist == n)
return;
i = p = rotdist;
j = n - p;
while(i != j){
if(i > j){
swap_block(arr, p-i, p, j);
i -= j;
}
else{
swap_block(arr, p-i, p+j-i, i);
j -= i;
}
}
swap_block(arr, p-i, p, i);
}

n元一维向量向左循环移位i的几种算法的更多相关文章

  1. n维向量旋转(循环移位)——学习《编程珠玑》

    问题: 将一个n元一维向量向左旋转i个位置.例如,当n=8且i=3时,向量abcdefgh旋转为defghabc. 简单的代码使用一个n元的中间向量在n步内完成该工作. 你能否仅使用数十个额外字节的存 ...

  2. TensorFlow.js入门(一)一维向量的学习

    TensorFlow的介绍   TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理.Tensor(张量)意味着N维数组,Flow(流)意味着 ...

  3. TensorFlow.js入门:一维向量的学习

    转载自:https://blog.csdn.net/weixin_34061042/article/details/89700664 一维向量及其运算 tensor 是 TensorFlow.js 的 ...

  4. matlab转c++代码实现(主要包含C++ std::vector,std::pair学习,包含数组与常数相乘,数组相加减,将数组拉成一维向量,图片的读入等内容)

    MATLAB部分: xmap = repmat( linspace( -regionW/2, regionW/2, regionW), regionH, 1 );%linspace [x1,x2,N] ...

  5. sql 三表左外链接的2种写法【原】

    初始化语句 DROP TABLE student; ) )); ','bobo'); ','sisi'); ','gugu'); ','mimi'); DROP TABLE room; ) ),roo ...

  6. 左神算法进阶班1_5BFPRT算法

    在无序数组中找到第k大的数1)分组,每N个数一组,(一般5个一组)2)每组分别进行排序,组间不排序3)将每个组的中位数拿出来,若偶数,则拿上 / 下中位数, 成立一个一个新数组.4)新数组递归调用BF ...

  7. c# 一维数组和二维数组的几种定义方式<转>

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Cons ...

  8. 写出Python中列表、元祖、字典、字符串的至少5种以上的方法

    1.列表 常用方法 作用 参数 append(data) 在尾部添加数据 data-加入到列表中的数据 insert(idx,data) 在指定位置添加数据 idx-索引    data-数据 ext ...

  9. python 版 mldivide matlab 反除(左除)《数学建模算法与程序》Python笔记

    今天在阅读数学建模的时候看到了差分那章 其中有一个用matlab求线性的代码,这里我贴出来 这里我送上 Python代码 In [39]: import numpy as np ...: from s ...

随机推荐

  1. 嵌入式C语言自我修养 04:Linux 内核第一宏:container_of

    4.1 typeof 关键字 ANSI C 定义了 sizeof 关键字,用来获取一个变量或数据类型在内存中所占的存储字节数.GNU C 扩展了一个关键字 typeof,用来获取一个变量或表达式的类型 ...

  2. sqli-labs(less-11-16)

    POST登入 首先试试 uname=admin'# & passwd=1 登入成功 如果不知道用户名 ,注释符被过滤,可以从password入手 一般第一个登陆字段(一般是用户名)就用注释,第 ...

  3. scala (7) Set and Tuple

    /** * 不可变长Set集合 */ val set0 = Set(1, 2, 3, 4, 5) //++并没有改变原有的set集合,只是将两个set进行合并形成新的set集合 val newSet0 ...

  4. PL/SQL轻量版(四)——存储函数/存储过程与触发器

    概述 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块,均存储在数 ...

  5. C语言字节对齐问题详解(对齐、字节序、网络序等)

    首先说明一下,本文是转载自: http://www.cnblogs.com/clover-toeic/p/3853132.html 博客园用的少,不知道怎么发布转载文章,只能暂时这样了. 引言 考虑下 ...

  6. 20155211实验二 Java面向对象程序设计

    20155211实验二 Java面向对象程序设计 实验内容 1.初步掌握单元测试和TDD 2.理解并掌握面向对象三要素:封装.继承.多态 3.初步掌握UML建模 4.熟悉S.O.L.I.D原则 5.了 ...

  7. 20155336 《Java程序设计》实验一(Java开发环境的熟悉)实验报告

    20155336 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 实验内容 1.使用JDK编译.运行简单的Java程序: 2.使用Eclipse 编辑.编译.运行.调试Jav ...

  8. 树链剖分学习&BZOJ1036

    题目传送门 树链剖分,计算机术语,指一种对树进行划分的算法,它先通过轻重边剖分将树分为多条链,保证每个点属于且只属于一条链,然后再通过数据结构(树状数组.SBT.SPLAY.线段树等)来维护每一条链. ...

  9. ELKStack入门篇(二)之Nginx、Tomcat、Java日志收集以及TCP收集日志使用

    1.收集Nginx的json格式日志 1.1.Nginx安装 [root@linux-node1 ~]# yum install nginx -y [root@linux-node1 ~]# vim ...

  10. bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统)

    bzoj1901&zoj2112&cogs257 Dynamic Rankings(动态排名系统) cogs zoj bzoj-权限 题解 bzoj和zoj都是骗访问量的233,我没有 ...