青岛大学_王卓老师【数据结构与算法】Week02_10_线性表的顺序表示和实现5_学习笔记

本文是个人笔记,仅用于学习分享,素材来自青岛大学王卓老师的教学视频,如有侵权,请留言作删文处理。

王卓老师 数据结构与算法第 02 周第 10 个原视频链接

📚 Week02_10_线性表的顺序表示和实现5–插入算法

📚 Week02_10_01 顺序表的插入位置在这里插入图片描述##### 插入不同位置的算法演示(黄色底色代表插入位置,移动元素和顺序表长度变化
(1) 插入位置在顺序表的最后在这里插入图片描述
(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,欢迎关注,一起交流学习进步~

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值