数据结构:不是专门的数值计算,而是研究非数值计算的程序设计问题中,计算机的操作对象以及它们的相互关系等.
数据:是对自然的描述,客观事物的符号描述.是可以输入到计算机中一切符号的总称.它是一个集合,每一项为一个数据元素.
数据元素:是数据的基本单位,处理的基本单位,但不是最小单位.数据元素中可包含多个数据项.
数据项:不可再细分的数据单位.
数据对象:是性质相同的数据元素的集合.如:整数,实数
数据结构:是带结构的数据元素的集合.它包含的数据不是孤立的,而是彼此之间有联系.
这种联系就叫做是结构:集合,线性结构,树形结构,图状结构(网)
数据结构初定义为DataStucture=<D,S>:D是数据元素的集合,而S是这个集合上的关系.
S描述的关系是一个逻辑关系,表示数据间的联系,可是任何联系都要存储到计算机中,由机器进行操作,所以会对应一个存储关系,又叫做物理结构.
如:逻辑关系可是有序对来表示,<X,Y>,而物理关系可用二进制位来表示.
其中物理上的存储关系又会分为两种:顺序映像和非顺序映像.
1>以存储位置之间相差一个常量位置来表示两个数据之间的关系,经常是紧挨着存放-顺序的
2>不以位置来表示彼此之间的关系,那么必须用附加的信息来表示,如指针-非顺序的
数据类型:用来表示变量或是表达式的范畴和允许的操作.是一个值的集合,和这个集合上所允许的操作的总称.
数据类型可分为原子类型,即它的值是不可再分的.如INT,另一种是结构类型,由若干成分按某种结构组成,是可以分解的.
-------
抽象数据类型:ADT
1>抽象,强调本质特性,完成的功能和用户接口,2>封装,内部实现细节不对外公开.
ADT:<D,S,P>三元组,其中P是对D的基本操作.
操作的参数有两种:一种是值,一种是引用,用"&",它用来提供输入值外,还将返回操作结果.
如:
Status InitTriplet(Triplet &T,ElemType v1,ElemType v2,ElemType v3)//Triplet为一个指向ElemType的指针,形参是一个引用.
{//Status 类型是当函数返回值为函数结果状态代码
T=(ElemType *)malloc(3*sizeof(ElemType));
if(T==null) exit;
T[0]=v1;T[1]=v2;T[2]=v3;
return OK;
}
-------
算法与算法分析
算法的特征:
1>有穷性:对任意一组合法的输入,有限步后都会结束,指令长度有限,每个操作语句执行时间有限.
2>确定性:对相同的输入产生的结果相同.
3>可行性:每一个操作都是由基本操作组成.
4>输入:
5>输出:
算法的要求:
1>正确性:必须满足既定的目标.正确的不同级别.
2>可读性:为了阅读与交流.
3>健壮性:有异常处理,不会程序自动退出等其它意外情况.
4>高效率,低存储要求---主要是与问题的规模有关.
时间复杂度:O(f(n)),基本操作重复的次数
空间复杂度:S(n)=O(f(n)),它是程序本身所占的空间,输入数据所占的空间,辅助变量所占用的空间.
只考虑辅助变量.
补充两个排序算法:
快速排序,将剩下的最小值放到这些值的最开头.
void select_sort(int a[],int n)
{
for(int i=0;i<n;i++)
{
int j=i;
for(int k=i+1;k<n;k++)
{
if(a[k]<a[j])
{j=k;}
if(i!=j)
{int temp=a[i];a[i]=a[j];a[j]=temp;}
}
}
}
冒泡排序,将值两两比较,最大的放到最下面.
void bubble_sort(int a[],int n)
{
for(int i=n-1,bool change=true;i>=1&&change;i--)
{
change =false;
for(int j=0;j<i;++j)
{
if(a[j]>a[j+1])
{
int temp=a[j];a[j]=a[j+1];a[j+1]=temp;
}
}
}
}