【数据结构】实验二:顺序表

实验二  顺序表

一、实验目的与要求

1)熟悉顺序表的类型定义;

2)熟悉顺序表的基本操作;

3)灵活应用顺序表解决具体应用问题。

二、实验内容

1)在一个整数序列a1,a2,…,an中,若存在一个数,大于它的整数数量和小于它的整数数量相等,则该数被称为“中间数”。请编写程序实现整数序列的“中间数”测试。具体样例:

/*样例输入  5    //包含5个整数的序列

3 4 6 6 7          //随机产生一个整数序列

则输出

-1               //输出-1表示整数序列“3 4 6 6 7”中不存在中间数

说明:

①在一个整数序列中,可能存在多个中间数。

②整数序列在程序中由随机数生成,程序输出“中间数”的值,若中间数不存在,则输出-1

2)股票收益:假设你知道接下来n天的某只股票的价格序列a1,a2,…,an,请编写程序实现确定最优的买入时间和卖出时间以获得最大收益。股票价格数组在程序中由随机数组成,程序输出最终可以获得的最大收益和买入卖出时间,若无收益则输出0

三、实验结果

1)简述算法步骤:

2)分析算法时间复杂度:

实验内容1

 0)代码内容:

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <time.h>
using namespace std;int main(){//初始化array int n;cout<<"请输入序列所包含的个数:"; cin>>n;int arr[n];int i=0;
//	for(i=0;i<n;i++){
//		arr[i]=rand()%100;//假设随机生成为100以内的数字 
//	}
//	//check array
//	cout<<endl<<"随机生成的整数数组如下:"<<endl; 
//	for(i=0;i<n;i++){
//		cout<<arr[i]<<endl;
//	}//srand优于rand随机生成? int *p;srand(time(0));for(p=arr;p<(arr+n);p++){*p=rand()%100;//假设随机生成为100以内的数字 }//check arraycout<<endl<<"随机生成的整数数组如下:"<<endl; for(p=arr;p<(arr+n);p++){cout<<*p<<" ";}//遍历寻找中间数int big,small,j;//big->比当前数大的个数,small->比当前数小的个数 int temp[n],cnt=0;//暂存中间数的数组 for(i=0;i<n;i++){big=0;//初始化big small=0;//初始化small for(j=0;j<n;j++){if(arr[i]>arr[j]){big++;}else if(arr[i]<arr[j]){small++;}}if(small==big){//符合中间数的要求->判断是否为重复元素 if(cnt==0){temp[cnt]=arr[i];//首个元素 cnt++;}else{int t=0,flag=1;for(t=0;t<cnt;t++){if(arr[i]==temp[t]){flag=0;//重复元素,不计入temp数组 break;}}if(flag==1){temp[cnt]=arr[i];//非重复元素,计入temp数组 cnt++;}}}} //	//check cnt
//	cout<<endl<<cnt<<endl;//输出中间数cout<<endl;if(cnt==0){cout<<-1<<endl;//中间数不存在 }else{cout<<"中间数如下:"<<endl; for(i=0;i<cnt;i++){cout<<temp[i]<<endl;} }return 0;
}

1)简述算法步骤:

-->程序开始

-->利用srand函数随机生成数组元素

-->通过内外层循环遍历寻找中间数(以当前数为基准,遍历比较其他数字)

-->若序列有中间数,判断中间数是否重复(建立临时数组存放并比较)

-->输出序列中间数的情况(不存在中间数 / 所有的中间数)

-->程序结束

2)分析算法时间复杂度:

首先,我们在遍历寻找中间数的时候使用了内外层循环,即先通过外层循环假设arr数组中每一个元素均可以作为中间数进行遍历,再通过内层循环比较当前元素与其他剩余元素的大小,确定比当前元素大的个数及比当前元素小的个数,进而确定当前元素作为数组序列的中间数是否可行。所以,这段算法的时间复杂度为平方阶O(n²)

其次,我们在判断所有中间数是否有重复情况时,建立了临时数组存放既往已经判断过的可行且不重复元素。那么,我们在下一次遇到可行的中间数元素的时候,在temp数组里面遍历与已经存入的中间数元素进行比较,确定当前元素的重复性。所以,这段算法的时间复杂度为线性阶O(n)

3)程序运行结果示例:

 

 实验内容2

0)代码内容:

 #include <iostream>
#include <cstdlib>
#include <cstdio>
#include <time.h>
using namespace std;int main(){cout<<"请输入某只股票的价格序列的模拟天数:";int n,i,j;cin>>n; //随机生成价格 int price[n-1];//n天的价格 天数为i+1 int *p;srand(time(0));for(p=price;p<(price+n);p++){*p=rand()%100;//假设随机生成为100以内的数字 }//check price[]cout<<endl<<"随机生成的价格数组如下:"<<endl; for(p=price;p<(price+n);p++){cout<<*p<<" ";}cout<<endl;int cnt=0,myday[n-1],money[n-1],maxday=0;for(i=0;i<n-1;i++){maxday=i+1;//从当前开始计算利润 for(j=i+1;j<=n-1;j++){if(price[j]-price[i]>price[maxday]-price[i]){maxday=j;}}myday[cnt]=maxday;money[cnt]=price[maxday]-price[i];cnt++;}//	//check myday and money
//	for(i=0;i<cnt;i++){
//		cout<<myday[i]+1<<","<<money[i]<<endl;
//	}//最优买入时间int best=0; for(i=1;i<cnt;i++){if(money[i]>money[best]){best=i;}} //cout<<best<<endl;//输出最大收益、买入卖出时间if(money[best]<0){cout<<0<<endl;//no benefit} else{cout<<"最大收益为:"<<money[best]<<endl;cout<<"买入时间为:第"<<best+1<<"天"<<endl;cout<<"卖出时间为:第"<<myday[best]+1<<"天"<<endl;}return 0; 
}

1)简述算法步骤:

-->程序开始

-->利用srand函数随机生成数组元素,作为接下来几天该只股票的价格

-->通过内外层循环遍历寻找当前天数时买入后可获得的最优价格及卖出天数(以当前天数的价格为基准,遍历后续几天的价格并作差比较)

-->通过循环遍历并比较每个天数买入后的最优价格,获取最优买入时间

-->输出序列的最大收益、买入时间、卖出时间等情况

-->程序结束

2)分析算法时间复杂度:

首先,我们在遍历寻找当前天数时买入后可获得的最优价格及卖出天数的时候,使用了内外层循环。先通过外层循环确立当前天数并初始化下一次的天数的股票价格为最优卖出天数,再通过内层循环比较后面每一天与当前天数的股票价格差值,确定当前天数的最优价格和卖出天数,并分别存入money数组与myday数组之中。所以,这段算法的时间复杂度为平方阶O(n²)

其次,我们在通过循环遍历并比较每个天数买入后的最优价格,获取最优买入时间的时候,是寻找一阶线性数组的最值的过程,即通过遍历money数组寻找最优解,并锁定myday数组里面的对应值。所以,这段算法的时间复杂度为线性阶O(n)

3)程序运行结果示例:

 

 

 


其他参考代码:

#include <iostream>
#include <cmath>
using namespace std;
int n,i;
class Sqlist{public:Sqlist()//初始化顺序表{data= new int[n];length=0;}~Sqlist()//删除顺序表{delete [] data;}void getSqlist(int m)//创建顺序表{int max=10;int min=0;for(int i=0;i<m;i++){data[i]=rand()%(max-min+1);}}void seekmiddle()//寻找中间数并输出“中间数”的值,若中间数不存在,则输出-1。{int j=0;for(;j<n;j++)//外层循环,锁定一个被比较的数data[j]{int g=0,l=0;//定义较大数(greater)的个数、较小数(less)的个数;for(i=0;i<n;i++)//内层循环,依次比较除data[j]本身的其他的数。{if(i!=j){if(data[i]>data[j]) g++;if(data[i]<data[j]) l++;}}if(g==l)//如果较大数=较小数,输出中间数{cout<<data[j];break;}}if(j==n) cout<<-1;}void printlist()//打印顺序表{for(i=0;i<n;i++)cout<<data[i]<<' ';cout<<endl;}int getlength()//返回顺序表长度{return length;}bool isEmpty()//判断顺序表是否为空;若为空,返回0{if(length==0) return false;}private:int *data;//顺序表的元素int length;//顺序表的长度
};
int main()
{Sqlist list1;cin>>n;list1.getSqlist(n);//获得随机数列list1.printlist();//打印顺序表list1.seekmiddle();//寻找并输出中间数return 0;}
#include <iostream>
#include <cmath>
using namespace std;
int n,i;
class Sqlist{public:Sqlist(){data= new int[n];length=0;}~Sqlist(){delete [] data;}void getSqlist(int m){int max=50;int min=0;for(int i=0;i<m;i++){data[i]=rand()%(max-min+1);}}void seekmax(){int max=0;int index1,index2;//记录下标,对应最佳买入、卖出的天数for(int j=0;j<n-1;j++)//外层循环,锁定第j+1天,以便比较和后面天数的差值{for(int k=j+1;k<n;k++)//内层循环,计算第j+1天和之后(第k+1天)的股票的差值{if(data[k]-data[j]>max)//依次寻找最大的差值{max=data[k]-data[j];index1=j;//记录对应下标index2=k;}}}if(max!=0){cout<<"在第"<<index1+1<<"天买入,第"<<index2+1<<"天卖出最合适。"<<endl;cout<<"最大利益为"<<max;}else cout<<0;//最大利益为0,则输出0}void printlist()//打印顺序表{for(i=0;i<n;i++)cout<<data[i]<<' ';cout<<endl;}int getlength()//返回顺序表长度{return length;}bool isEmpty()//判断顺序表是否为空;若为空,返回0{if(length==0) return false;}private:int *data;//顺序表的元素int length;//顺序表的长度
};
int main()
{Sqlist list1;cin>>n;//输入预测的天数nlist1.getSqlist(n);//获取股票list1.printlist();//打印股票list1.seekmax();//寻找最大利益return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/10768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux网络】 网络套接字(三)socket编程_TCP网络程序

目录 TCP网络程序服务端创建套接字并绑定服务端监听服务端获取连接服务器处理请求 客户端客户端创建套接字客户端连接服务器客户端发起请求测试 服务器存在的问题多进程版的TCP网络程序多线程版的TCP网络程序线程池版的TCP网络程序 TCP网络程序总结图 TCP网络程序 服务端 创建…

Dubbo

Dubbo 简介Dubbo的快速入门Dubbo的基本架构安装DubboAdmin入门案例Dubbo的最佳实践 Dubbo的高级特性启动检查多版本超时与重试负载均衡SpringCloud整合Dubbo案例 简介 Dubbo是阿里巴巴公司开源的一个高性能、轻量级的Java RPC框架。 致力于提高性能和透明化的RPC远程服务调用方…

Jenkins+Docker+Docker-Compose自动部署,SpringCloud架构公共包一个任务配置

前言 Jenkins和docker的安装&#xff0c;随便百度吧&#xff0c;实际场景中我们很多微服务的架构&#xff0c;都是有公共包&#xff0c;肯定是希望一个任务能够把公共包的配置加进去&#xff0c;一并构建&#xff0c;ok&#xff0c;直接上干货。 Jenkins 全局环境安装 pwd e…

DSA之图(4):图的应用

文章目录 0 图的应用1 生成树1.1 无向图的生成树1.2 最小生成树1.2.1 构造最小生成树1.2.2 Prim算法构造最小生成树1.2.3 Kruskal算法构造最小生成树1.2.4 两种算法的比较 1.3 最短路径1.3.1 两点间最短路径1.3.2 某源点到其他各点最短路径1.3.3 Dijkstra1.3.4 Floyd 1.4 拓扑排…

机器学习:Bert and its family

Bert 先用无监督的语料去训练通用模型&#xff0c;然后再针对小任务进行专项训练学习。 ELMoBertERNIEGroverBert&PALS Outline Pre-train Model 首先介绍预训练模型&#xff0c;预训练模型的作用是将一些token表示成一个vector 比如&#xff1a; Word2vecGlove 但是对于…

微服务契约测试框架-Pact

契约测试 契约测试的思想就是将原本的 Consumer 与 Provider 间同步的集成测试&#xff0c;通过契约进行解耦&#xff0c;变成 Consumer 与 Provider 端两个各自独立的、异步的单元测试。 契约测试的优点&#xff1a; 契约测试与单元测试以及其它测试之间没有重复&#xff0c…

Google Earth Engine谷歌地球引擎提取多波段长期反射率数据后绘制折线图并导出为Excel

本文介绍在谷歌地球引擎GEE中&#xff0c;提取多年遥感影像多个不同波段的反射率数据&#xff0c;在GEE内绘制各波段的长时间序列走势曲线图&#xff0c;并将各波段的反射率数据与其对应的成像日期一起导出为.csv文件的方法。 本文是谷歌地球引擎&#xff08;Google Earth Engi…

图为科技T501赋能工业机器人 革新传统工业流程

工业机器人已成为一个国家制造技术与科技水平的重要衡量标准&#xff0c;在2019年&#xff0c;中国工业机器人的组装量与产量均位居了全球首位。 当前&#xff0c;工业机器人被广泛用于电子、物流、化工等多个领域之中&#xff0c;是一种通过电子科技和机械关节制作出来的智能机…

浏览器端代理proxy 解决跨域

一.环境:使用expresshttp-proxy-middleware 直接上代码 // include dependencies const express require( express);//node内置的path模块导入 const path require("path")const { createProxyMiddleware } require( http-proxy-middleware); // 需要代理后端服…

行为型设计模式之策略模式【设计模式系列】

系列文章目录 C技能系列 Linux通信架构系列 C高性能优化编程系列 深入理解软件架构设计系列 高级C并发线程编程 设计模式系列 期待你的关注哦&#xff01;&#xff01;&#xff01; 现在的一切都是为将来的梦想编织翅膀&#xff0c;让梦想在现实中展翅高飞。 Now everythi…

【万字长文】SpringBoot整合SpringSecurity+JWT+Redis完整教程(提供Gitee源码)

前言&#xff1a;最近在学习SpringSecurity的过程中&#xff0c;参考了很多网上的教程&#xff0c;同时也参考了一些目前主流的开源框架&#xff0c;于是结合自己的思路写了一个SpringBoot整合SpringSecurityJWTRedis完整的项目&#xff0c;从0到1写完感觉还是收获到不少的&…

K8s Service网络详解(二)

K8s Service网络详解&#xff08;二&#xff09; Kube Proxy调度模式Kube-proxy IptablesKube-proxy IPVS Service SelectorPod DNS种常见的 DNS 服务Kube-DNSCoreDNSCorefile 配置 DNS 记录DNS 记录 ServiceDNS 记录 PodDNS 配置策略 Pod 的主机名设置优先级 Ingress Kube Pro…

Appium+python自动化(二十五)-获取控件ID(超详解)

简介 在前边的第二十二篇文章里&#xff0c;已经分享了通过获取控件的坐标点来获取点击事件的所需要的点击位置&#xff0c;那么还有没有其他方法来获取控件点击事件所需要的点击位置呢&#xff1f;答案是&#xff1a;Yes&#xff01;因为在不同的大小屏幕的手机上获取控件的坐…

ModStartCMS v6.9.0 后台多标签改进,主题色自动切换修复

ModStart 是一个基于 Laravel 模块化极速开发框架。模块市场拥有丰富的功能应用&#xff0c;支持后台一键快速安装&#xff0c;让开发者能快的实现业务功能开发。 系统完全开源&#xff0c;基于 Apache 2.0 开源协议&#xff0c;免费且不限制商业使用。 功能特性 丰富的模块市…

Redis学习2--使用java操作Redis

1、java操作Redis库的比较 Redis有各种语言的客户端可以来操作redis数据库&#xff0c;其中java语言主要有Jedis与lettuce &#xff0c;Spring Data Redis封装了上边两个客户端&#xff0c;优缺点如下&#xff1a; 2、使用Jedis操作Redis Jedis使用的基本步骤&#xff1a; 引…

企业服务器数据库被360后缀勒索病毒攻击后采取的措施

近期&#xff0c;360后缀勒索病毒的攻击事件频发&#xff0c;造成很多企业的服务器数据库遭受严重损失。360后缀勒索病毒是Beijingcrypt勒索家族中的一种病毒&#xff0c;该病毒的加密形式较为复杂&#xff0c;目前网络上没有解密工具&#xff0c;只有通过专业的技术人员对其进…

原生html—摆脱ps、excel 在线绘制财务表格加水印(html绘制表格js加水印)

文章目录 ⭐前言⭐html标签&#x1f496;table表格的属性&#x1f496;实现财务报表 ⭐结束 ⭐前言 大家好&#xff0c;我是yma16&#xff0c;本文分享原生html——绘制表格报表加水印。 背景&#xff1a;解决没有ps的情况下使用前端html制作表格报表。 html介绍 HTML&#xf…

【Android知识笔记】UI体系(一)

Activity的显示原理 setContentView 首先开发者Activity的onCreate方法中通常调用的setContentView会委托给Window的setContentView方法: 接下来看Window的创建过程: 可见Window的实现类是PhoneWindow,而PhoneWindow是在Activity创建过程中执行attach Context的时候创建的…

Kotlin多平台最佳架构指南

在这篇文章中&#xff0c;我们将对 Kotlin 多平台移动端的最佳架构进行深入探讨。在2023年&#xff0c;作为 Android 开发者&#xff0c;我们会倾向于采用 MVVM 架构&#xff0c;因为它简单、灵活且易于测试。而作为 iOS 开发者&#xff0c;我们可能会选择 MVC、Viper 等架构。…

QT基于TCP协议实现数据传输以及波形绘制

这个玩意我做了两个&#xff0c;一个是安卓app&#xff0c;一个是Windows程序。代码并非全部都是由我从无到有实现&#xff0c;只是实现了我想要的功能。多亏了巨人的肩膀&#xff0c;开源万岁&#xff01;&#xff01;&#xff01; 我把程序放到GitHub上&#xff0c;需要的可…