一.需求分析
必须利用实验一实现的线性表ADT,完成下面的题目。
对于给定n个数,请找出其中相差(差的绝对值)最小的两个数,输出它们的差值的绝对值。
【输入形式】
输入第一行包含一个整数n。
第二行包含n个正整数,相邻整数之间使用一个空格分隔。
【输出形式】
输出一个整数,表示答案。
【样例输入】
5
1 5 4 8 20
【样例输出】
1
【样例说明】
相差最小的两个数是5和4,它们之间的差值是1。
【样例输入】
5
9 3 6 1 3
【样例输出】
0
样例分析
【样例输入】
5
1 5 4 8 20
【样例输出】
1
简单运行步骤
1.输入5
2.输入五个数字储存进数组
3.数组进行从小到大的排序(sort循环)
例:1 4 5 8 20
4.int一个变量x等于第二个数减去第一个数的差值
5.之后的一个差值与x相比,比x小的就将差值赋值给x
二.概要设计
1.抽象数据类型
为实现上述程序的功能, 可以用整数存储用户的输入。并将用户输入的值存储于线性表中。
抽象数据类型设计:
数据对象:一组整数
数据关系:一组整数通过键盘依次输入,按照输入的先后次序,满足线性特征,即 <ai,ai+1>(0≤a<n)。
基本操作:准备一个能够存储一组整数的存储空间,存储整数
ADT:
数据对象:name marry【name】
基本操作:
List() {}
virtual~List() {} //析构,构造函数
virtual void append(const E& it) = 0; //操作功能 添加
virtual void next() = 0; //操作,移到下一个结点
virtual void moveToStart() = 0;//操作 移到当前位置
virtual const E &getValue() const = 0;//操作 获取当前位置的值
1.算法的基本思想
寻找最小值,最基本就是整数的存储符合线性的特点。可以采用顺序表来实现线性表,完成出列顺序的输出。
核心算法可以主要分为两步:
1.将整数存储到线性表中,并且进行从小到大的排序
2.两两相减,将差值存储在线性表中,并且与第一个差值相比,如果小于第一个差值,就将值赋值给第一个差值。
首先,我们可以先输入一个整数a,然后定义一个数组,再输入a个整数。运用sort循环将数从小到大排序。再两两相减,作出差值存储在线性表中。再作比较。
2.程序流程
程序有三个模块组成:
(1)输入模块:无提示语句,第一行输入总数 n,第二行依次输入整数,中间用空格隔开。
(2)处理模块:将元素的个数存储于顺序表中,再用sort循环。再作相减。差值相比较。
(3)输出模块:输出最小的差值
三.详细设计
1.物理数据模型
由于输入数据是整数,所以数据类型用 int。由于一组整数通过键盘依次输入,按照输入的先后次序,满足线性特征, 所以物理数据结构为线性结构
2.输入和输出的格式
输入为整数,输出也为整数
3.算法的具体步骤
ADT具体实现
for(int i=1;i<name;i++)
{
aa.append(marry[i]-marry[i-1])int name;
cin>>name;//输入
int marry[name];
for(int i=0;i<name;i++)
{cin>>marry[i]; //for循环输入 }
sort(marry,marry+name);//sort函数,按大小排列
LList<int>aa(1000);//利用链表存储数据
int p=0;p++;}
aa.moveToStart();
int x=marry[1]-marry[0];//存储在链表的每一个值为差值
for(int i=1;i<=p;i++)
{if(aa.getValue()<x)
{x=aa.getValue();}
aa.next();
3.算法的时空分析
(1)初始化部分为循环赋值,时间复杂度为n
(2)中间使用for循环找出差值,时间复杂度也为m
综上所述,时间复杂度为n
四.测试结果
ADT的定义,即物理数据结构的实现
问题分析:
1.我们需要处理的数据是int型整数
2.首先需要实现的功能是输入一个数字以及一个数组。并且进行大小排序,找出最小差值
3.运用for循环输入数字储存在数组里面。运用sort函数进行大小排序,运用for循环以及if语句来判断最小差值
4.最后输出最小差值
算法分析
每个功能设计的伪代码的时间复杂度都为1,主函数之中时间复杂度为n