问题重述:数组的循环左移。要求设计三种算法,将数组中的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. NABCD项目需求分析
  2. java 重写paint_java笔记 重写paintComponent方法以实现jPanel加背景
  3. python可以做哪些东西_自己总结的一些东西
  4. 循环、格式化输出、数据统计
  5. MySQL(5)---MySQL客户端工具的选择
  6. 动态调用Webservice 支持Soapheader身份验证(转)
  7. IBM X3650 M4 主板故障
  8. 转行做调度,你准备好了吗
  9. Winxp系统文件夹完全解析
  10. 为什么计算机网络使用数字信号,计算机网络数字电子技术的作用
  11. Linux开关键盘背光灯
  12. 【备忘】Spring Boot技术栈博客企业前后端
  13. 页面通过js获取并加载远程html文件,移除html文件中不需要的内容,修改html文件中img图片的路径
  14. 线性表的练习--学生成绩统计
  15. mysql实现同比环比的计算
  16. 用自制数据集训练yolov5步骤
  17. 数据治理的概念、难点和最佳实践方法
  18. 浅析游戏配乐的重要性
  19. 代码的“处理”英文该使用handle/cope/deal
  20. 中国慢慢的走到繁荣富强了

热门文章

  1. 【Angular】Angular 5 升级到Angular 6 过程实录
  2. 基于Matlab实现硬币计数
  3. 振作起来,做回我自己
  4. Android 自定义动画(实现类似分享动画)
  5. 智源研究院:开源开放让AI快速发展,要建设大模型时代的Linux | 中国AIGC产业峰会...
  6. dtu数据集 测试集介绍
  7. 蓝桥杯 历届试题 翻硬币
  8. 十个常用的html标记,Html常用标签介绍
  9. 极光推送关于证书的一些问题
  10. 关于select标签选中时的事件触发问题