本文主要陈述实现数组中元素旋转移位(以左移为例)的三种方法!其中第一种方法和第三种方法的时间复杂度为O(n),空间复杂度为1。第二种方法方法的时间复杂度为O(n),空间复杂度为i。【其中i为移动的位数,n为总位数】具体程序如下:
@1:

//【编程珠玑第二版P13上 移位的杂技表演法时间复杂度为O(n),空间复杂度为1】这种方法,笔者感觉非常好!笔者将针对这种方法专门写一篇BLOG!
#include <iostream>
using namespace std;
int gcd(int a, int b){
if(a * b == 0){
return 0;
}
while(a != b){
if(a > b)
a -= b;
else
b -= a;
}
return a;
}
void rotate(int * x, int n, int rotdist){ //时间复杂度为O(n),空间复杂度为1【t = x[i]】,效率高
int i, l = gcd(rotdist, n), k, t, j;
for(i = 0; i < l; ++ i){
t = x[i];
j = i;
while(1){
k = j + rotdist;
if(k >= n)
k -= n;
if(k == i)
break;
x[j] = x[k];
j = k;
}
x[j] = t; //t不能换成是x[k]或者x[i],因为x[i]已经被赋值为新的内容了!这也正是引入变量t的原因
}
}
int main(){
int array[] = {1, 3, 6, 2, 29, 3, 4, 5, 17};
int length = sizeof(array)/sizeof(array[0]);
int j;
for(j = 0; j < length; ++ j){
printf("%d\t", array[j]);
}
printf("\n");
rotate(array, length, 3); //间隔为3
for(j = 0; j < length; ++ j){
printf("%d\t", array[j]);
}
printf("\n");
return 0;
}

@2:

//【移位的普通方法,时间复杂度为O(n),空间复杂度为i】
#include <stdio.h>
#include <stdlib.h>
void rotate(int * x, int n, int i){  //此算法每个元素只移动一次,所以时间复杂度为O(n),空间复杂度为i【数组arrtem】
int j, t, k, temp, temp1, *arrtem;
arrtem = (int *)malloc(i * sizeof(int));
for(j = 0; j < i; ++ j){
t= x[j];
k = 0;
temp1 = j;
while(1){
temp = temp1 ;  //temp1可换为k * i % n。此处写为temp1可能让人不太容易懂,但有效的避免了重复计算。
++k;
temp1 = (k * i + j)% n ;
if(temp1 < temp){
break;
}else{
x[temp] = x[temp1];
}
}
arrtem[j] = t;
}
for(j = 0; j < i; ++ j){
x[n - i + j] = arrtem[j];
}
free(arrtem);
}
void main(){
int array[] = {1, 3, 6, 2, 29, 13, 5};
int length = sizeof(array)/sizeof(array[0]);
int j;
for(j = 0; j < length; ++ j){
printf("%d\t", array[j]);
}
printf("\n");
rotate(array, length, 4);  //间隔为4
for(j = 0; j < length; ++ j){
printf("%d\t", array[j]);
}
printf("\n");
}

@3:

//【编程珠玑第二版P13下手摇法实现移位:三次调用reverse函数】此算法时间复杂度为O(n),空间复杂度为1
#include <iostream>
using namespace std;
void reverse(int * array, int beg, int end){
int front = beg;
int behind = end;
int temp;
while(front < behind){
temp = array[front];
array[front] = array[behind];
array[behind] = temp;
++ front;
-- behind;
}
}
int main(){
int arr[] = {1, 29, 38, 2, 8, 12};
int i = 2;
int n = sizeof(arr)/sizeof(arr[0]);
int j;
for(j = 0; j < n; ++ j){
cout<<arr[j]<<'\t';
}
cout<<endl;
reverse(arr, 0, i - 1);
reverse(arr, i, n - 1);
reverse(arr, 0, n - 1);
for(j = 0; j < n; ++ j){
cout<<arr[j]<<'\t';
}
cout<<endl;
return 0;
}

如果您对本博文有什么意见,欢迎您与我联系!【我的邮箱】:lxw0109@gmail.com

数组中元素旋转移位的三种实现方法 --By LXW相关推荐

  1. python中的除法运算_python中矩阵除法运算的三种实现方法

    介绍过python矩阵的乘法运算,numpy库中虽然乘法是矩阵运算的主要运算,但是numpy作为python中实现矩阵运算的好工具,也是可以轻松实现除法计算的,本文python中矩阵除法的三种实现方法 ...

  2. php 三色排序,一个数组中只有0,1,2三种元素,要求对这样的数组进行排序,一个数组中只有0,1,2三种元素,要求对这样的数组进行排序,第2章 排序 | | 第17节 三色排序练习题...

    1.思路: 1.1思路1: 第一眼看到这样的题目,会举得非常简单,只需要两次遍历数组就可以完成了.第一次遍历,扫描数组中的元素,每次遇到0则count0++,遇到1则count1++,遇到2则coun ...

  3. JS实现找出数组中重复的数字的三种方法

    分享在JS中实现--找出数组中重复数字的方法的三种 法一. 排序比较法 先排序,再通过遍历比较,若相等,则添加到结果数组中,最后对结果数组进行去重,即可得到结果. function getSameNu ...

  4. 计算机维修直播,电脑直播过程中出现杂声怎么办?三种解决方法任你选

    现在,越来越多的人开始用电脑做直播.比如说利用直播来卖货或者分享个人的工作.生活状态.在电脑直播的时候,也会遇到各种各样的问题,其中,很多人就问到电脑直播有杂音滋滋响怎么办?电脑直播中发生杂音滋滋响, ...

  5. Javascript循环删除数组中元素的3种方法

    本文主要跟大家分享了关于Javascript循环删除数组中元素的几种方法,分享出来供大家参考学习,下面与微点阅读小编一起来看看详细的介绍: 问题 大家在码代码的过程中,经常会遇到在循环中移除指定元素的 ...

  6. JavaScript中遍历数组的for for-in和forEach三种方式

    JavaScript中遍历数组的for for-in和forEach三种方式 for循环 let arr = [1,2,3,4,5,6];for(let i = 0; i < arr.lengt ...

  7. 去除html重复的元素 js,js数组中去除重复值的几种方法

    在日常开发中,我们可能会遇到将一个数组中里面的重复值去除,那么,我就将我自己所学习到的几种方法分享出来 去除数组重复值方法: 1,利用indexOf()方法去除 思路:创建一个新数组,然后循环要去重的 ...

  8. 图形编程中,旋转的三种表示方法

    图形编程中,旋转的三种表示方法分别是:矩阵.欧拉角和四元数. 本文总结这三种表示方法的特点: 性质 矩阵 欧拉角 四元数 在坐标系间转换 能 不能 不能 连续或增量旋转 能,但是转换速度慢 不能 能, ...

  9. Java中遍历Set集合的三种方法

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

最新文章

  1. mysql构架,索引,视图,查询语句
  2. golang中的strings.Compare
  3. 英雄传说服务器维护中,英雄传说:星之轨迹 正统《轨迹》手游无法连接服务器是什么原因...
  4. 目前个人计算机使用的电子电路主要是,计算机基础知识理论题库.xls
  5. 440. 字典序的第K小数字
  6. SpringBoot整合redisson分布式锁
  7. 深度学习优化器演化史
  8. PHP调用OCX控件的具体方法
  9. SPOJ VLATTICE Visible Lattice Points 莫比乌斯反演
  10. android apk 防止反编译技术第一篇-加壳技术
  11. Java编程基础知识(一)
  12. 「构建企业级推荐系统系列」推荐系统与精细化运营
  13. 远程桌面端口映射如何设置
  14. php反序列化漏洞 freebuf,入门Web需要了解的PHP反序列化漏洞
  15. excel VLOOKUP查找
  16. python提取excel内容
  17. 路由刷机(Breed)操作步骤
  18. 前端常用得CSS代码分享
  19. STM32 四轴无人机的设计——基于HCSR04超声波模块的距离检测与警报设计
  20. 作为维基百科全书的系统、全球最著名的wiki程序——MediaWiki

热门文章

  1. 超静音服务器性能强,静音服务器:最适合办公环境的静音服务器
  2. API-String类、基本数据类型对象包装类
  3. 破解手机辐射危害健康的流言
  4. 写文三年了,给大家说点儿心里话
  5. 【解惑】杨中科说给弟弟的话
  6. pytorch实现用CNN和LSTM对文本进行分类
  7. java 生成正弦波声音_Java错误生成声音正弦波
  8. iptables白名单
  9. 试题 算法训练 娜神平衡
  10. ORACLE学习(三)