本文是个人笔记,仅用于学习分享,素材来自青岛大学王卓老师的教学视频,如有侵权,请留言作删文处理。
📚 Week02_10_线性表的顺序表示和实现5–插入算法
📚 Week02_10_01 顺序表的插入位置
##### 插入不同位置的算法演示(黄色底色代表插入位置,移动元素和顺序表长度变化)
(1) 插入位置在顺序表的最后![在这里插入图片描述](https://img-blog.csdnimg.cn/4fafdce24a3445f5ac585a3445b597d0.png#pic_center)
(2) 插入位置在顺序表的中间
(3) 插入位置在顺序表的最前面
⚠️ 注意:插入顺序表的位置范围在:[0, n+1]
📚 Week02_10_02 顺序表的插入算法思想
线性表的插入运算是指在表的第 i (1 ≤ i ≤ n+1) 个位置上,插入一个新结点 e,
使长度为 n 的线性表 (a1, a2, …, ai-1, ai, ai+1, …, an) 变成长度为 n + 1 的线性表 (a1, a2, …, ai-1, e, ai, ai+1, …, an)
算法思想:
① 判断插入位置 i 是否合法。
② 判断顺序表的存储空间是否已满,若已满返回 ERROR。
③ 将第 n 至第 i 位的元素依次向后移动一个位置,空出第 i 个位置。
④ 将要插入的新元素 e 放入第 i 个位置。
📚 Week02_10_03 顺序表的插入算法伪代码实现
Status ListInsert_Sq(SqList &L, int i, ElemType e)
{
// (1)判断 i 值是否合法
if(i < 1 || i > (L.length + 1))
return ERROR;
// (2)判断当前存储空间是否已满
if(L.length == MAXSIZE)
return ERROR;
// (3)插入位置及之后的元素后移
for(int j = L.length -1; j >= i-1; j--)
L.elem[j+1] = L.elem[j];
// (4)将新元素 e 放入第 i 个位置
L.elem[i-1] = e;
// (5)表长 +1
L.length++;
return OK;
}
📚 Week02_10_04 顺序表的插入算法时间复杂度分析
算法时间主要耗费在移动元素的操作上:
⭐ 若插入在尾结点之后,则根本无需移动(特别快);
⭐ 若插入在首结点之前,则表中元素全部后移(特别慢);
⭐ 若要考虑在各种位置插入(共 n + 1 种可能)的平均移动次数,该如何计算?
在各个位置插入,则每个位置插入的概率是 1 / (n +1)
插入 n + 1 的位置,需要移动 0 次,平均移动次数:0 × ( 1 / (n +1) )
插入 n 的位置,需要移动 1 次,平均移动次数:1 × ( 1 / (n +1) )
插入 n - 1 的位置,需要移动 2 次,平均移动次数:2 × ( 1 / (n +1) )
……
则有:
顺序表插入算法的平均时间复杂度为:O( n )
学习笔记最后有微信公众号:惟CPP,欢迎关注,一起交流学习进步~