问题:数组的循环左移。要求设计三种算法,将数组中的N个元素能够实现循环左移p个位置。
问题重述:数组的循环左移。要求设计三种算法,将数组中的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个位置。相关推荐
- 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 ...
- 关于随机输出数组中所有元素的三种算法
算法一:比较常见,也比较容易想到.缺点:如果arrA中有重复元素,那么重复的元素只会输出一次. int[] arrA={1,2,3,4,5,6}; int[] arrB=new int[arrA.le ...
- java定义数组_java中数组的三种定义方式_java中数组的定义及使用方法(推荐)...
java中数组的三种定义方式 java中,数组是一种很常用的工具,今天我们来说说数组怎么定义 [java] view plain copy /** * 数组的三种定义方法 * 1.数组类型[] 数组名 ...
- EDM模板设计:教您设计三种独特的邮件营销模板
教您设计三种独特的邮件营销模板 邮件营销,模板 众所周知,好的邮件营销必须要有好的模板设计,这也是EDM设计研究中非常重要的一个环节.下面博主教大家设计三种独特的邮件营销模板,供大家参考和学习. 一. ...
- python怎么循环终止_Python 循环终止语句的三种方法小结
Python 循环终止语句的三种方法小结 在Python循环终止语句有三种: 1.break break用于退出本层循环 示例如下: while True: print "123" ...
- 三种算法求两个正整数的最大公约数和最小公倍数;求三个数的最大公约数和最小公倍数
第二次作业 题目:求两个正整数的最大公约数和最小公倍数. 基本要求:1.程序风格良好(使用自定义注释模板),两种以上算法解决最大公约数问题,提供友好的输入输出. 提高要求:1.三种以上算法解决两个正整 ...
- 最短路小结(三种算法+各种常见变种)
额,博主只是做了几(约数)道题而已,写这篇小结纯粹想留作纪念(勿喷,但是可以交流)(那啥,转载的话注明一下来源..打字不容易..) 最短路呢,包括三种算法,但是各有各的变种,其中变化有很多. 简单记录 ...
- 绘制云图的三种算法(附C#代码)
我们要做什么呢?就是输入一个二维数组, TestData = new double[9, 6] {{ 26,28,29,32,28,27},{ 27,30,32,35,30,28},{ 24,27,3 ...
- 三种算法求解经典N皇后问题
三种算法求解经典N皇后问题 [问题描述] 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题.该问题是十九世纪著名的数学家高斯1850年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击, ...
最新文章
- NABCD项目需求分析
- java 重写paint_java笔记 重写paintComponent方法以实现jPanel加背景
- python可以做哪些东西_自己总结的一些东西
- 循环、格式化输出、数据统计
- MySQL(5)---MySQL客户端工具的选择
- 动态调用Webservice 支持Soapheader身份验证(转)
- IBM X3650 M4 主板故障
- 转行做调度,你准备好了吗
- Winxp系统文件夹完全解析
- 为什么计算机网络使用数字信号,计算机网络数字电子技术的作用
- Linux开关键盘背光灯
- 【备忘】Spring Boot技术栈博客企业前后端
- 页面通过js获取并加载远程html文件,移除html文件中不需要的内容,修改html文件中img图片的路径
- 线性表的练习--学生成绩统计
- mysql实现同比环比的计算
- 用自制数据集训练yolov5步骤
- 数据治理的概念、难点和最佳实践方法
- 浅析游戏配乐的重要性
- 代码的“处理”英文该使用handle/cope/deal
- 中国慢慢的走到繁荣富强了