问题重述:数组的循环左移。要求设计三种算法,将数组中的N个元素能够实现循环左移p个位置。

算法1:

先将数组中的前p个元素存放在一个临时数组中,再将余下的N-p个元素左移p个位置,最后将前p个元素从临时数组复制回原数组中后面的p个位置。

void leftMoveal1(int p)//方案1:先移动前p个元素,再移动后N-p个元素,最后再移动p个元素。

算法2:

先设计一个leftmoveone()函数将数组向左循环移动1个位置,再调用该算法p次。

void leftmoveone() ( )//方案2的子函数:将数组循环左移1个数字

void leftMoveal12(int p)//方案2:每次循环左移1个数字,调用p次

{

循环调用p次 leftmoveone() ();

}

算法3:

将这个问题看作是把数组AB转换成数组BA(A代表数组的前p个元素,B代表数组中余下的N-p个元素),先将A置逆,再将B置逆,两次逆置之后得到BA,最后再将整个BA逆置。

void reverary(DataType a[],int low, int high);//方案3的子函数,将数组的low 到high逆置,注意下标。

void leftmoveal3(int p)//方案3,先逆置前p个元素,再逆置后N-p个元素,最后整体逆置N个元素

{

逆置函数的调用

….

}

程序的实现:

head.h

#pragma once
#include <iostream>
using namespace std;
const int maxsize = 100;//使用户输入的数组可以尽可能的大
class leftmove
{
private:int data[maxsize];int length;
public:leftmove(int a[], int b);//a[]为临时数组,b是数组的长度void leftMoveal1(int p);//算法1void leftmoveone();void leftMoveal12(int p);//算法2void reverary(int low, int high);void leftmoveal3(int p);//算法3void display();
};

head.cpp

#include "head.h"leftmove::leftmove(int a[], int b){int i;if (b<0 || b>maxsize)cout << "Error!" << endl;elsefor (i = 0; i < b; i++)data[i] = a[i];length = b;}void leftmove::leftMoveal1(int p){int i;int* q = new int[p];for (i = 0; i < p; i++)q[i] = data[i];for (i = 0; i < length - p; i++)data[i] = data[i + p];for (i = 0; i < p; i++)data[i + length - p] = q[i];}void leftmove::leftmoveone(){int i, temp;temp = data[0];for (i = 0; i < length - 1; i++)data[i] = data[i + 1];data[length - 1] = temp;}void leftmove::leftMoveal12(int p){int i;for (i = 0; i < p; i++)leftmoveone();}//算法3选择1/*void leftmove::reverary(int low, int high){int i;int* p = new int[high - low + 1];for (i = 0; i < high - low + 1; i++)p[i] = data[low - 1 + i];for (i = 0; i < high - low + 1; i++)data[low + i - 1] = p[high - low - i];}void leftmove::leftmoveal3(int p){reverary(1, p);reverary(p + 1, length);reverary(1, length);}*///算法3选择2void leftmove::reverary(int low, int high){int s = low, t = high;while (s < t){int r = data[s];data[s] = data[t];data[t] = r;s++;t--;}}void leftmove::leftmoveal3(int p){reverary(0, p - 1);reverary(p, length - 1);reverary(0, length - 1);}void leftmove::display(){int i;if (length == 0)cout << "empty!" << endl;elsefor (i = 0; i < length; i++)cout << data[i];cout << endl;}

main.cpp

#include "head.h"int main(){int length, i, q;cout << "Please input length:";cin >> length;int* p = new int[length];cout << "Please input the data:";for (i = 0; i < length; i++)cin >> p[i];class leftmove test(p, length);test.display();cout << "please input the q:";cin >> q;int choice;cout << "请选择算法1、2、3:" << endl;cin >> choice;if (choice == 1)test.leftMoveal1(q);else if (choice == 2)test.leftMoveal12(q);else if (choice == 3)test.leftmoveal3(q);elsecout << "Error!" << endl;test.display();return 0;}

代码运行的截图:

以上分别为算法1、2、3的运行结果截图。其中算法3不管是选择一方法或是选择二方法,均可实现。

最后鸣谢: 

1.该代码由男朋友舍友刘浩、男朋友马志豪以及我共同完成。更多的思路都是前两位提供的,我只是进行了少量的修改,以及最后的整合工作。希望我们能在简单的大学生活中留下自己的记忆,也希望之后的未来 前程似锦。

2.其中算法3的选择二是参考了“菜鸟成长之路-wei”的《数组循环向左移动k位的算法》这一篇文章其中的颠倒交换法。

问题:数组的循环左移。要求设计三种算法,将数组中的N个元素能够实现循环左移p个位置。相关推荐

  1. 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 ...

  2. 关于随机输出数组中所有元素的三种算法

    算法一:比较常见,也比较容易想到.缺点:如果arrA中有重复元素,那么重复的元素只会输出一次. int[] arrA={1,2,3,4,5,6}; int[] arrB=new int[arrA.le ...

  3. java定义数组_java中数组的三种定义方式_java中数组的定义及使用方法(推荐)...

    java中数组的三种定义方式 java中,数组是一种很常用的工具,今天我们来说说数组怎么定义 [java] view plain copy /** * 数组的三种定义方法 * 1.数组类型[] 数组名 ...

  4. EDM模板设计:教您设计三种独特的邮件营销模板

    教您设计三种独特的邮件营销模板 邮件营销,模板 众所周知,好的邮件营销必须要有好的模板设计,这也是EDM设计研究中非常重要的一个环节.下面博主教大家设计三种独特的邮件营销模板,供大家参考和学习. 一. ...

  5. python怎么循环终止_Python 循环终止语句的三种方法小结

    Python 循环终止语句的三种方法小结 在Python循环终止语句有三种: 1.break break用于退出本层循环 示例如下: while True: print "123" ...

  6. 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数

    第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...

  7. 最短路小结(三种算法+各种常见变种)

    额,博主只是做了几(约数)道题而已,写这篇小结纯粹想留作纪念(勿喷,但是可以交流)(那啥,转载的话注明一下来源..打字不容易..) 最短路呢,包括三种算法,但是各有各的变种,其中变化有很多. 简单记录 ...

  8. 绘制云图的三种算法(附C#代码)

    我们要做什么呢?就是输入一个二维数组, TestData = new double[9, 6] {{ 26,28,29,32,28,27},{ 27,30,32,35,30,28},{ 24,27,3 ...

  9. 三种算法求解经典N皇后问题

    三种算法求解经典N皇后问题 [问题描述] 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击, ...

最新文章

  1. Bounce 弹飞绵羊
  2. ConcurrentHashMap的源码分析-扩容过程图解
  3. StackOverflow 每月5.6亿PV,但只用25台服务器
  4. Java 的这 100 个坑,我发誓不会再踩了
  5. 回溯算法之布罗夫卫队(最大团问题)
  6. 论文浅尝 | 融合多粒度信息和外部语言知识的中文关系抽取
  7. Linux定制history命令的输出格式
  8. 数据库SQL语句解析
  9. c语言不用的行参警告,如何在C语言中禁止“未使用的参数”警告?
  10. android ukey,Tenorshare 4uKey for Android
  11. 码农小汪-非常不安逸 怎么我写的注解没有自动给我生成时间呢!javadoc 配置起来非常的简单
  12. 用matlab s函数 阶梯,Matlab S函数使用介绍
  13. 在痛苦的日子里笑出声来
  14. 基于瞬时功率理论的APF的SIMULINK模型
  15. linux设置用户的执行权限,Linux下ACL权限控制以及用sudo设置用户对命令的执行权限...
  16. 【5G核心网】5G概念以及名词缩写解释
  17. 基于embedded.mobileprovision描述文件查看iOS苹果证书到期时间三种方案
  18. 视频号直播带货变现,微信小商店常见的10大问题丨国仁网络
  19. win7u盘内容在计算机右侧,帮您恢复win7系统取消插入U盘后计算机窗口右侧显示U盘内容的技巧介绍...
  20. GPS内置有源天线和无源天线的区别?

热门文章

  1. NSLog使用详解与性能分析
  2. PyTorch:tensor、torch.nn、autograd、loss等神经网络学习手册(持续更新)
  3. Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用
  4. 内存中有两个4字节以压缩的bcd_【汇编程序】循环程序设计方法 求A和B两个4字节BCD数之和 他们在内存中以压缩BCD码形式存放...
  5. 刷脸支付时代让智能终端回归人本身
  6. 几款浏览器插件让你的科研效率翻倍!新的一年你装上了吗?
  7. Qt识别一维码、二维码软件分享
  8. Termux Api
  9. 基于单片机霍尔电机测速仪表控制系统设计(毕业设计资料)
  10. 面试 Google, 我失败了 | Google 面经分享