一、线性表(List):由零个或多个数据元素组成的有限序列。
1.序列:有先来后到
2.第一个无前驱,最后一个无后继。其他元素有且只有一个前驱和后继。
3.有限的
4.一对一的关系
抽象数据类型(ADT):指一组性质相同的值的集合及定义在此集合上的一些操作和总称。
线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素;具有随机存储结构的特点
在存、读数据时,不管哪个位置时间复杂度都是O(1),插入删除时则为O(n)
优点:无需为表中元素之间的逻辑关系而增加额外的存储空间;可以快速存取表中任意位置的元素
缺点:插入和删除需要移动大量元素;线性表长度较大时难以确定存储空间的容量;造成空间浪费
线性表的链式存储结构:数据域+指针域=结点,具有顺序存取的存取结构
首元结点:第一个结点
头结点:在首元结点前附设的一个节点,其指针域指向首元结点
头指针:若有头结点则指向头结点,没有则指向首元结点。
单链表中最后一个结点的指针为空NULL
头结点的作用:1.便于首元结点的处理 2.便于空表和非空表的统一处理
循环链表
双向链表
8.2 直接插入排序
代码实现:
void InsertSort(List &L)
{
for(int i=0;i<=L.length;++i)
{
if(L.r[i].num<L.r[i-1].num)
{
L.r[0]=L.r[i];//将待插入的数据暂存到监视哨r[0]中
L.r[i]=L.r[i-1];//后移r[i-1]
for(int j=i-2;L.r[0].num<L.r[j].num;--j)//逐个后移直到找到插入位置
L.r[j+1]=L.r[j];
L.r[j+1]=L.r[0];//将数据插入到正确位置
}
}
}
时间复杂度O(n^2) 空间复杂度O(1):只需要一个记录的辅助空间
【算法特点】:
1)稳定排序
2)简便且易实现
3)顺序存储/链式存储都可以
4)适合初始数据基本有序,否则算法复杂度较高