循环移动数组元素

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 线性回归 均方误差_线性回归模型中随机误差项的意义

    线性回归 均方误差_线性回归模型中随机误差项的意义刚开始学习机器学习的时候就接触了均方误差(MSE,MeanSquaredError),当时就有疑惑,这个式子是怎么推导的,但是因为懒没有深究。今天看到了唐宇迪老师的机器学习课程,终于理解他是怎么推导的了。问题描述我们有工资和年龄两个特征,要预测银行会带宽给我们多少钱。1.拟合函数假设:年龄:x1x_1x1​工资:x2x_2x2​年龄的参数:θ1θ_1θ1​工资的参数:θ2θ_2θ2​那么有拟合函数:(1)将它转化为矩阵表达形式为:(2)其中x0全为1。2.误差真实值和预

    2022年9月29日
    0
  • LaTeX 插入图片失败[通俗易懂]

    LaTeX 插入图片失败[通俗易懂]LaTeX插入图片失败(引擎pdflatex)\includegraphics使用figure环境本身可正常编译,只使用\centering时\caption可正常插入。增加\includegraphics[width=10cm]{..}插入png图片时,报错100行,第101行报“Toomanyerrors.TeXstopped.”(已\usepackage{graphicx},不是旧包graphics的问题)几种报错语句重复出现,可能是循环错。“Missinge

    2022年6月6日
    39
  • php中网页生成图片的方式,类似长微博图片生成器「建议收藏」

    php中网页生成图片的方式,类似长微博图片生成器「建议收藏」导读:因媒体站微博传播需要,需在转发文章至新浪微博时能将文章正文已图片形式传播出去,用以提高微博内容转发积极性,顾需要在原有php项目代码中加入网页转图片功能。 在java中网页转图片有已经开源的转换工具,较为简单,php中网页转图片的开源工具很少,少到只有一个半成品(只能通过命令行调用,无法使用php代码生成)html2image(http://www.guangmingsoft.n…

    2022年5月21日
    33
  • macbook如何安装双系统_双系统安装方法

    macbook如何安装双系统_双系统安装方法1.官网https://www.microsoft.com/zh-cn/software-download/windows10ISO进入官网下载win10(因为win10仅支持win10专业版不要下家庭中文版)语言:简体中文64位2.用迅雷下否则直接下载时间会很长Mac迅雷-轻体验,大改变(拖动迅雷至文件夹,即可安装,macOS10.15安装后请到应用程序找到图标,右键打开)点击迅雷的加号新建任务在浏览器复制之后自动弹出迅雷下载对话保存位置至桌面点击下载打开浏览器.

    2022年9月28日
    0
  • apache 负载均衡策略_负载均衡slb

    apache 负载均衡策略_负载均衡slb参考文章:http://www.2cto.com/os/201109/102368.html在观看本文章之前,请先观看apache负载均衡之配置:http://blog.csdn.net/a787031584/article/details/64907389apache负载均衡策略有三种:第一种:轮询策略:即根据http请求数(requests)来均衡的分配给所代理的服

    2022年9月8日
    0
  • windows杀进程命令 杀不掉_windows杀掉进程

    windows杀进程命令 杀不掉_windows杀掉进程1丶获取某端口的进程netstat-ano|findstr80802丶获取任务列表tasklist|findstr148203丶杀进程taskkill/pid14820-t-f

    2022年9月5日
    3

发表回复

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

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