循环移动数组元素

循环移动数组元素//循环移动数组元素//一种大部分数据只移动一次的算法//方法://  将数据循环移动,可以直接计算出每个数据的最终位置,直接移动即可//分析://  这种算法基本可看做每个数据只需要移动一次//  但是每个数据移动的位置需要计算,算法

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
 

// 循环移动数组元素
// 一种大部分数据只移动一次的算法
// 方法:
//   将数据循环移动, 可以直接计算出每个数据的最终位置, 直接移动即可
// 分析:
//   这种算法基本可看做每个数据只需要移动一次
//   但是每个数据移动的位置需要计算, 算法理解起来比较难, 实现也比较复杂
//   另外,由于总是间隔较远存取数据,在数据数量较大的时候会导致比较频繁缓存命中失败
//   常用的两次翻转算法,每个数据需要swap两次(平均每个移动3次),而且很容易理解,实现也简单

#include “stdafx.h”
#include <algorithm>
#include <iostream>

// 最大公约数
size_t gcd(size_t n, size_t m)
{

 if(n==0 || m == 0)
  return 0;

 while(true)
 {

  n %= m;
  if(n == 0)
   return m;
  std::swap(n, m);
 }
}

// 循环左移
template<typename T>
void CycleMove(T* data, size_t nLen, size_t nMov)
{

 if(data == 0 || nLen <= 1)
  return;

 nMov %= nLen;
 if(nMov == 0)
  return;

 // 分组处理
 size_t nGroup = gcd(nLen, nMov);
 // 每组数据数量
 size_t nGroupSize = nLen / nGroup;

 for(size_t i=0; i<nGroup; ++i)
 {

  // 保存第一个数
  T d0 =  data[i];
  size_t iPosD = 0;
  size_t iPosS = i;

  // 先移动nGroupSize-1个
  for(size_t j=1; j<nGroupSize; ++j)
  {

   // 数据位置
   iPosD = iPosS;
   iPosS += nMov;
   iPosS %= nLen;

   // 将数据左移
   data[iPosD] = data[iPosS];
  }
  // 将第一个放到最后
  data[iPosS] = d0;
 }
}

int _tmain(int argc, _TCHAR* argv[])
{

 char data[] = {-52, 83, 111, 103, 46, 115, 82, -111};
 size_t nNum = sizeof(data)/sizeof(data[0]);

 CycleMove(data, nNum,  3);

 for(size_t i=0; i<nNum; ++i)
 {

  std::cout << (int)data[i];
  if(i != nNum-1)
   std::cout << ” , “;
  else
   std::cout << std::endl;
 }

 return 0;
}

// 输出
// 103 , 46 , 115 , 82 , -111 , -52 , 83 , 111

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159963.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mshtml文档的处理

    objectc=null;myWeb.Navigate(“http://zhidao.baidu.com/”,refc,refc,refc,refc);//…获取WebBroswer中的body代码mshtml.HTMLDocumentClassdoc=(mshtml.HTMLDocumentClass)myWeb.Document;mshtml.HTMLBodybody=(ms…

    2022年4月8日
    34
  • ubuntu远程桌面控制_ubuntu 远程控制

    ubuntu远程桌面控制_ubuntu 远程控制已经使用的,备份Section”Monitor”Identifier”Monitor0″HorizSync28.0-80.0VertRefresh48.0-75.0#https://arachnoid.com/modelines/#1920×1080@60.00Hz(GTF)hsync:67.08kHz;pclk:172…

    2022年8月21日
    9
  • Haar特征提取算法的实现

    Haar特征提取算法的实现自己动手 丰衣食足 系列 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp Haar 特征是一种很早就被提出的图像特征提取算法 后面还经过了几次改进 Haar 特征能够很好地运用于人脸识别技术 当然很多目标检测技术中对目标图像的特征提取也可以使用 Haar 特征 当我们使用 opencv 自带的 cascade 分类器时可以选择 Haar 特征作为训练样本数据的特征描述子 然后将特征描述子作为样本数据送入 cascade 分类器中 就可以通过 Adab

    2025年7月10日
    4
  • 静态路由命令配置_配置静态路由的命令格式为

    静态路由命令配置_配置静态路由的命令格式为前话之前发表了相关路由协议简单配置命令,RIP、OSPF等都是动态路由协议。这次我简单写一下静态理由简单配置命令,的确很简单一行命令就可以了。静态路由介绍静态路由是指由用户或网络管理员手工配

    2022年8月1日
    7
  • codeforces Arrival of the General 题解

    codeforces Arrival of the General 题解

    2022年1月31日
    37
  • C++ 序列化和反序列化

    C++ 序列化和反序列化序列化序列化1、背景2、定义3、序列化评价指标4、序列化实例参考序列化1、背景1、在TCP的连接上,它传输数据的基本形式就是二进制流,也就是一段一段的1和0。2、在一般编程语言或者网络框架提供的API中,传输数据的基本形式是字节,也就是Byte。一个字节就是8个二进制位,8个Bit。二进制流和字节流本质上是一样的。对于我们编写的程序来说,它需要通过网络传输的数据是结构化的数据,比如,一条命令、一段文本或者一条消息。对应代码中,这些结构化的数据都可以用一个类或者一个结构体来表示。序

    2022年6月17日
    24

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号