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

news2024/11/16 11:41:02

实验二  顺序表

一、实验目的与要求

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 array
	cout<<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;//输入预测的天数n
   
    list1.getSqlist(n);//获取股票
    list1.printlist();//打印股票
    list1.seekmax();//寻找最大利益
    return 0;
}

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

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

相关文章

调用post请求方式的feign接口怎么传递多个参数,包含对象和字符串

今天尝试把自己原来的项目上的权限管理相关的类抽离开来&#xff0c;并建立一个统一的权限管理平台&#xff0c;然后项目中要用到的权限相关资源通过feigin请求权限平台的对应接口获取。 现在有一个需求&#xff0c;页面上有一个一键获取资源权限的按钮&#xff0c;点击一下&a…

python_PyQt5开发验证K线视觉想法工具V1.0

目录 写在前面&#xff1a; 使用过程&#xff1a; 代码&#xff1a; 导入的包、字符型横坐标、K线控件 K线图控件 放置标记数据表格控件 输入并设置标记数据控件 主界面 运行代码 写在前面&#xff1a; 开发这个工具的初衷&#xff0c;是基于在分析股票实践中想批量计算…

Django实现音乐网站 ⑴

使用Python Django框架制作一个音乐网站。 目录 网站功能模块 安装django 创建项目 创建应用 注册应用 配置数据库 设置数据库配置 设置pymysql库引用 创建数据库 创建数据表 生成表迁移文件 执行表迁移 后台管理 创建管理员账户 启动服务器 登录网站 配置时区…

神码ai火车头伪原创设置【php源码】

大家好&#xff0c;给大家分享一下python考什么内容&#xff0c;很多人还不知道这一点。下面详细解释一下。现在让我们来看看&#xff01; 火车头采集ai伪原创插件截图&#xff1a; 1、Python 计算机二级都考什么 Python要到什么程度 考试内容 一、Python语言的基本语法元素…

高算力AI模组前沿应用:基于ARM架构的SoC阵列式服务器

本期我们带来高算力AI模组前沿应用&#xff0c;基于ARM架构的SoC阵列式服务器相关内容。澎湃算力、创新架构、异构计算&#xff0c;有望成为未来信息化社会的智能算力底座。 ▌性能优势AI驱动&#xff0c;ARM架构服务器加速渗透 一直以来&#xff0c;基于ARM架构的各类处理器…

Tooltip文字提示(antd-design组件库)简单使用

1.Tooltip文字提示 简单的文字提示气泡框。 2.何时使用 鼠标移入则显示提示&#xff0c;移出消失&#xff0c;气泡浮层不承载复杂文本和操作。 可用来代替系统默认的 title 提示&#xff0c;提供一个 按钮/文字/操作 的文案解释。 组件代码来自&#xff1a; 文字提示 Tooltip -…

读写分离案例、Mysql主从复制 步骤

在开发大型应用程序时&#xff0c;数据库的性能通常是一个关键问题。读写分离是一种常见的数据库优化技术&#xff0c;可以显著提升数据库的读取操作性能。本文将介绍MySQL主从复制和一个读写分离案例。 1、MySQL主从复制 主从复制是MySQL数据库提供的一种数据复制机制&#…

免费商城搭建、免费小程序商城搭建、之java商城 电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景+b2b2c

1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家平台&#xff08;H5/公众号、小程序、APP端&#xff08;IOS/Android&#xff09;、微服务平台&#xff08;业务服务&#xff09; 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

【黑马头条之内容安全第三方接口】

本笔记内容为黑马头条项目的文本-图片内容审核接口部分 目录 一、概述 二、准备工作 三、文本内容审核接口 四、图片审核接口 五、项目集成 一、概述 内容安全是识别服务&#xff0c;支持对图片、视频、文本、语音等对象进行多样化场景检测&#xff0c;有效降低内容违规风…

vue+ivew model框 select校验遇到的问题

iview model 点击关闭&#xff0c;校验没有通过也会关闭 解决办法&#xff1a; 第一步&#xff1a;自定义页脚内容 <div slot"footer"><Button type"primary" click"confirmCarryOver()">确认</Button><Button click&qu…

python绘制3D条形图

文章目录 数据导入三维条形图bar3d 数据导入 尽管在matplotlib支持在一个坐标系中绘制多组条形图&#xff0c;效果如下 其中&#xff0c;蓝色表示中国&#xff0c;橘色表示美国&#xff0c;绿色表示欧盟。从这个图就可以非常直观地看出&#xff0c;三者自2018到2022年的GDP变化…

智能制造:开启工业新纪元

随着科技的不断发展和人工智能的日益成熟&#xff0c;智能制造正成为当今工业界的热门话题。智能制造是一种以先进技术为支撑&#xff0c;通过数字化、网络化、智能化手段来提升生产效率、优化生产流程的现代化制造模式。 在智能制造中&#xff0c;物联网、大数据、云计算、人工…

OR-Tools工具安装(Python-Vs code)-自用

安装&#xff08;已安装python以及Vs code&#xff09; pip安装 python -m pip install --user ortools安装完成示意如下&#xff1a; 验证安装 python -c "import ortools; print(ortools.__version__)"输出结果为版本号

【Spring框架】@Resource注入以及与@Autowired的区别

目录 使用Resource设置name的方式来重命名注入的对象区别 使用Resource设置name的方式来重命名注入的对象 package com;import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.spr…

Ansible自动化运维工具

Ansible是一个基于Python开发的配置管理和应用部署工具&#xff0c;现在也在自动化管理领域大放异彩。它融合了众多老牌运维工具的优点&#xff0c;Pubbet和Saltstack能实现的功能&#xff0c;Ansible基本上都可以实现。 Ansible能批量配置、部署、管理上千台主机。比如以前需要…

解读维达国际2023半年度财报:后续发力“高端、高利润、高质量”

随着国内直播电商市场的迅速发展&#xff0c;对于希望在国内市场取得成功的品牌来说&#xff0c;直播电商已经成为所有大众消费品牌的竞争关键。 以生活用纸品牌维达为例&#xff0c;截至2023年7月25日&#xff0c;据抖音平台直播动态显示&#xff0c;维达官方旗舰店今年上半年…

opencv-27 阈值处理 cv2.threshold()

怎么理解阈值处理? 阈值处理&#xff08;Thresholding&#xff09;是一种常用的图像处理技术&#xff0c;在机器学习和计算机视觉中经常被用于二值化图像或二分类任务。它基于设定一个阈值来将像素值进行分类&#xff0c;将像素值大于或小于阈值的部分分为两个不同的类别&…

geomesa-cassandra安装测试

环境&#xff1a;centos7、java8、cassandra3.0.29、geomesa-cassandra_2.12-3.5.2 配置Java环境&#xff1a; 安装配置cassandra: 下载cassandra&#xff1a; wget https://www.apache.org/dyn/closer.lua/cassandra/3.0.29/apache-cassandra-3.0.29-bin.tar.gz tar -xzf ap…

一文了解声音克隆软件的技术原理

声音克隆软件是一种可以对人声进行复制和模拟的软件。它的技术原理主要包括语音信号处理和合成声音的算法。 首先&#xff0c;声音克隆软件会通过麦克风或其他录音设备获取用户的原始语音信号。这个语音信号将被传输到计算机中&#xff0c;经过一系列的处理和分析。 在语音信号…

微信小程序自动化测试实战,支持录制回放、智能遍历

为了满足小程序性能、功能等方面的测试需求&#xff0c;微信团队上线 小程序云测服务&#xff0c;提供丰富的自动化测试能力。其中 智能化 Monkey 服务 凭借着零代码、低成本的优势吸引不少开发者使用。 在服务使用过程中&#xff0c;我们发现开发者有更多的进阶需求&#xff…