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. python-类(1)

    ·类(Class) 笔记: Python是一种面向对象(Object Oriented)的编程语言,类(Class)是Python的核心概念.在Python中,不管是列表.字符串.函数和类都是对象. ...

  2. 01-Python简介

    人生苦短,我用 Python —— Life is short, you need Python 目标 Python 的起源 Python 解释器 是用 C 语言实现的,并能够调用 C 语言的库文件. ...

  3. Go 学习之路:引用类型与值类型

    Golang中只有三种引用类型:slice(切片).map(字典).channel(管道): 引用类型 引用类型理解为(C语言):指针 值类型 值的拷贝 下面以值类型和slice(切片)例子可知: p ...

  4. 论 Python Opencv 中文路径及中文文件名图像文件读取的两种方式

    python 2中对于中文字符的处理可谓是诟病已久,虽然python 3 使用统一编码解决了中文字符串的问题,但在使用opencv中imread函数读取中文路径图像文件时仍会报错. 1) 借助nump ...

  5. 探秘GO语言《比较C#与GO的性能--XML序列化》

    今天对GO和NET的XML字符串序列化成对象列表做了一个性能比较,得出一些结论. GO的代码: package main import ( "encoding/xml" " ...

  6. #《JAVA程序设计》 20155214 实验五 网络编程与安全

    <JAVA程序设计> 20155214 实验五 网络编程与安全 实验内容 掌握Socket程序的编写: 掌握密码技术的使用: 设计安全传输系统. 实验要求 要求一 结对实现中缀表达式转后缀 ...

  7. Ubuntu genymotion

    官网注册帐号 下载genymotion-[VERSION]_[ARCH].bin 进入android studio In Android Studio, go to File > Setting ...

  8. CF 547 D. Mike and Fish

    D. Mike and Fish http://codeforces.com/contest/547/problem/D 题意: 给定平面上n个点,将这些点染成红或者蓝色,要求每行.每列红色点与蓝色点 ...

  9. Android线程管理(一)——线程通信

    线程通信.ActivityThread及Thread类是理解Android线程管理的关键. 线程,作为CPU调度资源的基本单位,在Android等针对嵌入式设备的操作系统中,有着非常重要和基础的作用. ...

  10. C#Framework4.0支持异步async/await语法

    由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...